JGCtoGdT

Dependencies:   ConfigFile MODSERIAL_uVision Watchdog mbed-rtos mbed

Committer:
JavierGC
Date:
Sun May 05 16:39:34 2013 +0000
Revision:
0:2e1b2d9fa0de
JGCtoGdT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JavierGC 0:2e1b2d9fa0de 1 #include "mbed.h"
JavierGC 0:2e1b2d9fa0de 2 #include "MODSERIAL.h"
JavierGC 0:2e1b2d9fa0de 3 #include "rtos.h"
JavierGC 0:2e1b2d9fa0de 4 #include "Watchdog.h"
JavierGC 0:2e1b2d9fa0de 5 #include "ConfigFile.h"
JavierGC 0:2e1b2d9fa0de 6
JavierGC 0:2e1b2d9fa0de 7 Watchdog wd;
JavierGC 0:2e1b2d9fa0de 8
JavierGC 0:2e1b2d9fa0de 9 extern "C" void mbed_reset();
JavierGC 0:2e1b2d9fa0de 10
JavierGC 0:2e1b2d9fa0de 11 char InitialMessage[50];
JavierGC 0:2e1b2d9fa0de 12
JavierGC 0:2e1b2d9fa0de 13 DigitalOut ledCAN1(LED1);
JavierGC 0:2e1b2d9fa0de 14 DigitalOut ledCAN2(LED2);
JavierGC 0:2e1b2d9fa0de 15 DigitalOut led3(LED3);
JavierGC 0:2e1b2d9fa0de 16 DigitalOut ledPC(LED4);
JavierGC 0:2e1b2d9fa0de 17
JavierGC 0:2e1b2d9fa0de 18
JavierGC 0:2e1b2d9fa0de 19 time_t ctTime;
JavierGC 0:2e1b2d9fa0de 20 struct tm * timeinfo;
JavierGC 0:2e1b2d9fa0de 21
JavierGC 0:2e1b2d9fa0de 22 Ticker SpkTick;
JavierGC 0:2e1b2d9fa0de 23 Timer myT;
JavierGC 0:2e1b2d9fa0de 24
JavierGC 0:2e1b2d9fa0de 25
JavierGC 0:2e1b2d9fa0de 26 void LoadPCMail(char comm, char *mess);
JavierGC 0:2e1b2d9fa0de 27
JavierGC 0:2e1b2d9fa0de 28 /************* Frequency ****************/
JavierGC 0:2e1b2d9fa0de 29 InterruptIn Freq1(p15);
JavierGC 0:2e1b2d9fa0de 30 InterruptIn Freq2(p16);
JavierGC 0:2e1b2d9fa0de 31 InterruptIn Freq3(p17);
JavierGC 0:2e1b2d9fa0de 32 Timer F1;
JavierGC 0:2e1b2d9fa0de 33 Timer F2;
JavierGC 0:2e1b2d9fa0de 34 Timer F3;
JavierGC 0:2e1b2d9fa0de 35
JavierGC 0:2e1b2d9fa0de 36 int Period1,Period2,Period3;
JavierGC 0:2e1b2d9fa0de 37
JavierGC 0:2e1b2d9fa0de 38 void Freq1_Meas(void)
JavierGC 0:2e1b2d9fa0de 39 {
JavierGC 0:2e1b2d9fa0de 40 Period1=F1.read_us();
JavierGC 0:2e1b2d9fa0de 41 F1.reset();
JavierGC 0:2e1b2d9fa0de 42 }
JavierGC 0:2e1b2d9fa0de 43 void Freq2_Meas(void)
JavierGC 0:2e1b2d9fa0de 44 {
JavierGC 0:2e1b2d9fa0de 45 Period2=F2.read_us();
JavierGC 0:2e1b2d9fa0de 46 F2.reset();
JavierGC 0:2e1b2d9fa0de 47 }
JavierGC 0:2e1b2d9fa0de 48 void Freq3_Meas(void)
JavierGC 0:2e1b2d9fa0de 49 {
JavierGC 0:2e1b2d9fa0de 50 Period3=F3.read_us();
JavierGC 0:2e1b2d9fa0de 51 F3.reset();
JavierGC 0:2e1b2d9fa0de 52 }
JavierGC 0:2e1b2d9fa0de 53 /************* End Frequency ************/
JavierGC 0:2e1b2d9fa0de 54
JavierGC 0:2e1b2d9fa0de 55 /************* PWM ****************/
JavierGC 0:2e1b2d9fa0de 56 PwmOut PwmO1(LED3);
JavierGC 0:2e1b2d9fa0de 57 /************* End PWM ************/
JavierGC 0:2e1b2d9fa0de 58
JavierGC 0:2e1b2d9fa0de 59 /************* CAN ***********************/
JavierGC 0:2e1b2d9fa0de 60 #define CAN_MaxMailElements 16
JavierGC 0:2e1b2d9fa0de 61 #define CANMessWait 1//ms
JavierGC 0:2e1b2d9fa0de 62 #define MessSizeCAN 128
JavierGC 0:2e1b2d9fa0de 63
JavierGC 0:2e1b2d9fa0de 64 typedef struct {
JavierGC 0:2e1b2d9fa0de 65 char command; /* command to execute */
JavierGC 0:2e1b2d9fa0de 66 CANMessage mess;
JavierGC 0:2e1b2d9fa0de 67 } CAN_mail_t;
JavierGC 0:2e1b2d9fa0de 68 /************* CAN 1 *********************/
JavierGC 0:2e1b2d9fa0de 69 CAN can1(p9,p10);
JavierGC 0:2e1b2d9fa0de 70 int CAN1Freq=1000000;
JavierGC 0:2e1b2d9fa0de 71
JavierGC 0:2e1b2d9fa0de 72 Mail<CAN_mail_t, CAN_MaxMailElements> CAN1_mail;
JavierGC 0:2e1b2d9fa0de 73 int CAN1MailNum;
JavierGC 0:2e1b2d9fa0de 74
JavierGC 0:2e1b2d9fa0de 75 void LoadCAN1Mail(char command, CANMessage mess) //para cargar mensajes de trabajo al proceso paralelo CAN1_thread_proc
JavierGC 0:2e1b2d9fa0de 76 {
JavierGC 0:2e1b2d9fa0de 77 while(CAN1MailNum>=CAN_MaxMailElements) {
JavierGC 0:2e1b2d9fa0de 78 Thread::wait(CANMessWait);
JavierGC 0:2e1b2d9fa0de 79 }
JavierGC 0:2e1b2d9fa0de 80 CAN_mail_t *mail = CAN1_mail.alloc();
JavierGC 0:2e1b2d9fa0de 81 mail->command = command;
JavierGC 0:2e1b2d9fa0de 82 mail->mess=mess;
JavierGC 0:2e1b2d9fa0de 83 CAN1_mail.put(mail);
JavierGC 0:2e1b2d9fa0de 84 CAN1MailNum++;
JavierGC 0:2e1b2d9fa0de 85 }
JavierGC 0:2e1b2d9fa0de 86
JavierGC 0:2e1b2d9fa0de 87 void messageFromCAN1()
JavierGC 0:2e1b2d9fa0de 88 {
JavierGC 0:2e1b2d9fa0de 89 ledCAN1=true;
JavierGC 0:2e1b2d9fa0de 90 CANMessage msg;
JavierGC 0:2e1b2d9fa0de 91 can1.read(msg);
JavierGC 0:2e1b2d9fa0de 92 LoadCAN1Mail(10,msg);
JavierGC 0:2e1b2d9fa0de 93 }
JavierGC 0:2e1b2d9fa0de 94
JavierGC 0:2e1b2d9fa0de 95 void CAN1_thread_proc(void const *args) //proceso paralelo de gestión CAN1
JavierGC 0:2e1b2d9fa0de 96 {
JavierGC 0:2e1b2d9fa0de 97 char tmp[MessSizeCAN];
JavierGC 0:2e1b2d9fa0de 98 while(true) {
JavierGC 0:2e1b2d9fa0de 99 osEvent evt = CAN1_mail.get(osWaitForever);
JavierGC 0:2e1b2d9fa0de 100 if (evt.status == osEventMail) {
JavierGC 0:2e1b2d9fa0de 101 CAN_mail_t *mail = (CAN_mail_t*)evt.value.p;
JavierGC 0:2e1b2d9fa0de 102
JavierGC 0:2e1b2d9fa0de 103 switch (mail->command) {
JavierGC 0:2e1b2d9fa0de 104 case 0: //request Reset CAN
JavierGC 0:2e1b2d9fa0de 105 can1.reset();
JavierGC 0:2e1b2d9fa0de 106 LoadPCMail(1,"Reset CAN1");
JavierGC 0:2e1b2d9fa0de 107 break;
JavierGC 0:2e1b2d9fa0de 108 case 1: //set frequency
JavierGC 0:2e1b2d9fa0de 109 can1.frequency(mail->mess.id);
JavierGC 0:2e1b2d9fa0de 110 LoadPCMail(1,"Set Frequency CAN1");
JavierGC 0:2e1b2d9fa0de 111 break;
JavierGC 0:2e1b2d9fa0de 112 case 10: //Read from CAN
JavierGC 0:2e1b2d9fa0de 113 snprintf(tmp,MessSizeCAN,"ID=%i;TYPE=%i;FORMAT=%i;LEN=%d;DATA[0]=%u;DATA[1]=%u;DATA[2]=%u;DATA[3]=%u;DATA[4]=%u;DATA[5]=%u;DATA[6]=%u;DATA[7]=%u",mail->mess.id,mail->mess.type,mail->mess.format,mail->mess.len,mail->mess.data[0],mail->mess.data[1],mail->mess.data[2],mail->mess.data[3],mail->mess.data[4],mail->mess.data[5],mail->mess.data[6],mail->mess.data[7]);
JavierGC 0:2e1b2d9fa0de 114 LoadPCMail(2,tmp);
JavierGC 0:2e1b2d9fa0de 115 break;
JavierGC 0:2e1b2d9fa0de 116 case 20: //Write to CAN
JavierGC 0:2e1b2d9fa0de 117 can1.write(mail->mess);
JavierGC 0:2e1b2d9fa0de 118 LoadPCMail(1,"Write to CAN1");
JavierGC 0:2e1b2d9fa0de 119 break;
JavierGC 0:2e1b2d9fa0de 120 default: // request to send message from code
JavierGC 0:2e1b2d9fa0de 121 break;
JavierGC 0:2e1b2d9fa0de 122 }
JavierGC 0:2e1b2d9fa0de 123 CAN1_mail.free(mail);
JavierGC 0:2e1b2d9fa0de 124 CAN1MailNum--;
JavierGC 0:2e1b2d9fa0de 125 ledCAN1=false;
JavierGC 0:2e1b2d9fa0de 126 }
JavierGC 0:2e1b2d9fa0de 127 }
JavierGC 0:2e1b2d9fa0de 128 }
JavierGC 0:2e1b2d9fa0de 129 /************* END CAN 1 ****************/
JavierGC 0:2e1b2d9fa0de 130 /************* CAN 2 ********************/
JavierGC 0:2e1b2d9fa0de 131 CAN can2(p30,p29);
JavierGC 0:2e1b2d9fa0de 132 int CAN2Freq=1000000;
JavierGC 0:2e1b2d9fa0de 133
JavierGC 0:2e1b2d9fa0de 134 Mail<CAN_mail_t, CAN_MaxMailElements> CAN2_mail;
JavierGC 0:2e1b2d9fa0de 135 int CAN2MailNum;
JavierGC 0:2e1b2d9fa0de 136
JavierGC 0:2e1b2d9fa0de 137 void LoadCAN2Mail(char command, CANMessage mess) //para cargar mensajes de trabajo al proceso paralelo CAN1_thread_proc
JavierGC 0:2e1b2d9fa0de 138 {
JavierGC 0:2e1b2d9fa0de 139 while(CAN2MailNum>=CAN_MaxMailElements) {
JavierGC 0:2e1b2d9fa0de 140 Thread::wait(CANMessWait);
JavierGC 0:2e1b2d9fa0de 141 }
JavierGC 0:2e1b2d9fa0de 142 CAN_mail_t *mail = CAN2_mail.alloc();
JavierGC 0:2e1b2d9fa0de 143 mail->command = command;
JavierGC 0:2e1b2d9fa0de 144 mail->mess=mess;
JavierGC 0:2e1b2d9fa0de 145 CAN2_mail.put(mail);
JavierGC 0:2e1b2d9fa0de 146 CAN2MailNum++;
JavierGC 0:2e1b2d9fa0de 147 }
JavierGC 0:2e1b2d9fa0de 148 void messageFromCAN2()
JavierGC 0:2e1b2d9fa0de 149 {
JavierGC 0:2e1b2d9fa0de 150 ledCAN2=true;
JavierGC 0:2e1b2d9fa0de 151 CANMessage msg;
JavierGC 0:2e1b2d9fa0de 152 can2.read(msg);
JavierGC 0:2e1b2d9fa0de 153 LoadCAN2Mail(10,msg);
JavierGC 0:2e1b2d9fa0de 154 }
JavierGC 0:2e1b2d9fa0de 155 void CAN2_thread_proc(void const *args) //proceso paralelo de gestión CAN1
JavierGC 0:2e1b2d9fa0de 156 {
JavierGC 0:2e1b2d9fa0de 157 char tmp[MessSizeCAN];
JavierGC 0:2e1b2d9fa0de 158 while(true) {
JavierGC 0:2e1b2d9fa0de 159 osEvent evt = CAN2_mail.get(osWaitForever);
JavierGC 0:2e1b2d9fa0de 160 if (evt.status == osEventMail) {
JavierGC 0:2e1b2d9fa0de 161 CAN_mail_t *mail = (CAN_mail_t*)evt.value.p;
JavierGC 0:2e1b2d9fa0de 162
JavierGC 0:2e1b2d9fa0de 163 switch (mail->command) {
JavierGC 0:2e1b2d9fa0de 164 case 0: //request Reset CAN
JavierGC 0:2e1b2d9fa0de 165 can2.reset();
JavierGC 0:2e1b2d9fa0de 166 LoadPCMail(1,"Reset CAN2");
JavierGC 0:2e1b2d9fa0de 167 break;
JavierGC 0:2e1b2d9fa0de 168 case 1: //set frequency
JavierGC 0:2e1b2d9fa0de 169 can2.frequency(mail->mess.id);
JavierGC 0:2e1b2d9fa0de 170 LoadPCMail(1,"Set Frequency CAN2");
JavierGC 0:2e1b2d9fa0de 171 break;
JavierGC 0:2e1b2d9fa0de 172 case 10: //Read from CAN
JavierGC 0:2e1b2d9fa0de 173 snprintf(tmp,MessSizeCAN,"ID=%i;TYPE=%i;FORMAT=%i;LEN=%d;DATA[0]=%u;DATA[1]=%u;DATA[2]=%u;DATA[3]=%u;DATA[4]=%u;DATA[5]=%u;DATA[6]=%u;DATA[7]=%u",mail->mess.id,mail->mess.type,mail->mess.format,mail->mess.len,mail->mess.data[0],mail->mess.data[1],mail->mess.data[2],mail->mess.data[3],mail->mess.data[4],mail->mess.data[5],mail->mess.data[6],mail->mess.data[7]);
JavierGC 0:2e1b2d9fa0de 174 LoadPCMail(3,tmp);
JavierGC 0:2e1b2d9fa0de 175 break;
JavierGC 0:2e1b2d9fa0de 176 case 20: //Write to CAN
JavierGC 0:2e1b2d9fa0de 177 can2.write(mail->mess);
JavierGC 0:2e1b2d9fa0de 178 LoadPCMail(1,"Write to CAN2");
JavierGC 0:2e1b2d9fa0de 179 break;
JavierGC 0:2e1b2d9fa0de 180 default: // request to send message from code
JavierGC 0:2e1b2d9fa0de 181 break;
JavierGC 0:2e1b2d9fa0de 182 }
JavierGC 0:2e1b2d9fa0de 183 CAN2_mail.free(mail);
JavierGC 0:2e1b2d9fa0de 184 CAN2MailNum--;
JavierGC 0:2e1b2d9fa0de 185 ledCAN2=false;
JavierGC 0:2e1b2d9fa0de 186 }
JavierGC 0:2e1b2d9fa0de 187 }
JavierGC 0:2e1b2d9fa0de 188 }
JavierGC 0:2e1b2d9fa0de 189 /************* END CAN 2 ****************/
JavierGC 0:2e1b2d9fa0de 190 /************* END CAN ******************/
JavierGC 0:2e1b2d9fa0de 191
JavierGC 0:2e1b2d9fa0de 192 /************* RS232 PC ******************/
JavierGC 0:2e1b2d9fa0de 193 #define TxBuffer_NumMess 16
JavierGC 0:2e1b2d9fa0de 194 #define RxBuffer_NumMess 16
JavierGC 0:2e1b2d9fa0de 195 #define MessSizePC 128
JavierGC 0:2e1b2d9fa0de 196 #define TxBuffer TxBuffer_NumMess*MessSizePC
JavierGC 0:2e1b2d9fa0de 197 #define RxBuffer RxBuffer_NumMess*MessSizePC
JavierGC 0:2e1b2d9fa0de 198 #define PC_MaxMailElements 16
JavierGC 0:2e1b2d9fa0de 199 #define PCMessWait MessSizePC*10/9.6 //ms
JavierGC 0:2e1b2d9fa0de 200
JavierGC 0:2e1b2d9fa0de 201 MODSERIAL pc(USBTX, USBRX,TxBuffer,RxBuffer);
JavierGC 0:2e1b2d9fa0de 202 bool LOGPC;
JavierGC 0:2e1b2d9fa0de 203 int BaudRate;
JavierGC 0:2e1b2d9fa0de 204 double TxBufferWait;
JavierGC 0:2e1b2d9fa0de 205 char ChEnd;
JavierGC 0:2e1b2d9fa0de 206
JavierGC 0:2e1b2d9fa0de 207 typedef struct {
JavierGC 0:2e1b2d9fa0de 208 char command; /* command to execute */
JavierGC 0:2e1b2d9fa0de 209 char message[MessSizePC]; /* arguments */
JavierGC 0:2e1b2d9fa0de 210 } PC_mail_t;
JavierGC 0:2e1b2d9fa0de 211
JavierGC 0:2e1b2d9fa0de 212 Mail<PC_mail_t, PC_MaxMailElements> PC_mail;
JavierGC 0:2e1b2d9fa0de 213 int PCMailNum;
JavierGC 0:2e1b2d9fa0de 214
JavierGC 0:2e1b2d9fa0de 215 void TLogSTR(char *Tstr)
JavierGC 0:2e1b2d9fa0de 216 {
JavierGC 0:2e1b2d9fa0de 217 ctTime = time(NULL);
JavierGC 0:2e1b2d9fa0de 218 timeinfo = localtime ( &ctTime );
JavierGC 0:2e1b2d9fa0de 219 timeinfo->tm_hour=(timeinfo->tm_hour+1)%24;
JavierGC 0:2e1b2d9fa0de 220 strftime (Tstr,MessSizePC,"%H:%M:%S",timeinfo);
JavierGC 0:2e1b2d9fa0de 221 }
JavierGC 0:2e1b2d9fa0de 222
JavierGC 0:2e1b2d9fa0de 223 void LoadPCMail(char comm, char *mess) //para cargar mensajes de trabajo al proceso paralelo ComPC_thread_proc
JavierGC 0:2e1b2d9fa0de 224 {
JavierGC 0:2e1b2d9fa0de 225 while(PCMailNum>=PC_MaxMailElements) {
JavierGC 0:2e1b2d9fa0de 226 Thread::wait(PCMessWait);
JavierGC 0:2e1b2d9fa0de 227 }
JavierGC 0:2e1b2d9fa0de 228 if(comm!=1 || LOGPC) {
JavierGC 0:2e1b2d9fa0de 229 PC_mail_t *mail = PC_mail.alloc();
JavierGC 0:2e1b2d9fa0de 230 mail->command = comm;
JavierGC 0:2e1b2d9fa0de 231 snprintf(mail->message,MessSizePC,"%s",mess);
JavierGC 0:2e1b2d9fa0de 232 PC_mail.put(mail);
JavierGC 0:2e1b2d9fa0de 233 PCMailNum++;
JavierGC 0:2e1b2d9fa0de 234 }
JavierGC 0:2e1b2d9fa0de 235 }
JavierGC 0:2e1b2d9fa0de 236
JavierGC 0:2e1b2d9fa0de 237 void messageFromPC(MODSERIAL_IRQ_INFO *q) //trabajo solicitado desde PC
JavierGC 0:2e1b2d9fa0de 238 {
JavierGC 0:2e1b2d9fa0de 239 ledPC=true;
JavierGC 0:2e1b2d9fa0de 240 MODSERIAL *sys = q->serial;
JavierGC 0:2e1b2d9fa0de 241 char temp[MessSizePC];
JavierGC 0:2e1b2d9fa0de 242
JavierGC 0:2e1b2d9fa0de 243 int i=sys->move(temp,MessSizePC,ChEnd);
JavierGC 0:2e1b2d9fa0de 244 if (temp[i-2]=='\r') {
JavierGC 0:2e1b2d9fa0de 245 i-=2;
JavierGC 0:2e1b2d9fa0de 246 } else {
JavierGC 0:2e1b2d9fa0de 247 i-=1;
JavierGC 0:2e1b2d9fa0de 248 }
JavierGC 0:2e1b2d9fa0de 249 temp[i]=0;
JavierGC 0:2e1b2d9fa0de 250 LoadPCMail(0,temp);
JavierGC 0:2e1b2d9fa0de 251 }
JavierGC 0:2e1b2d9fa0de 252
JavierGC 0:2e1b2d9fa0de 253 int ComPC_Write(char *mess) //sólo para usarse en ComPC_thread_proc
JavierGC 0:2e1b2d9fa0de 254 {
JavierGC 0:2e1b2d9fa0de 255 int i=strlen(mess);
JavierGC 0:2e1b2d9fa0de 256 if(i>0) {
JavierGC 0:2e1b2d9fa0de 257 while((TxBuffer-pc.txBufferGetCount())<i) {
JavierGC 0:2e1b2d9fa0de 258 Thread::wait(TxBufferWait);
JavierGC 0:2e1b2d9fa0de 259 }
JavierGC 0:2e1b2d9fa0de 260 return pc.printf(mess);
JavierGC 0:2e1b2d9fa0de 261 }
JavierGC 0:2e1b2d9fa0de 262 return 0;
JavierGC 0:2e1b2d9fa0de 263 }
JavierGC 0:2e1b2d9fa0de 264
JavierGC 0:2e1b2d9fa0de 265 void ComPC_thread_proc(void const *args) //proceso paralelo de gestión PC: tareas solicitadas y envío a PC
JavierGC 0:2e1b2d9fa0de 266 {
JavierGC 0:2e1b2d9fa0de 267
JavierGC 0:2e1b2d9fa0de 268 while(true) {
JavierGC 0:2e1b2d9fa0de 269 osEvent evt = PC_mail.get(osWaitForever);
JavierGC 0:2e1b2d9fa0de 270 if (evt.status == osEventMail) {
JavierGC 0:2e1b2d9fa0de 271 PC_mail_t *mail = (PC_mail_t*)evt.value.p;
JavierGC 0:2e1b2d9fa0de 272
JavierGC 0:2e1b2d9fa0de 273 char mess[MessSizePC];
JavierGC 0:2e1b2d9fa0de 274 char Tstr[20];
JavierGC 0:2e1b2d9fa0de 275 TLogSTR(Tstr);
JavierGC 0:2e1b2d9fa0de 276 switch (mail->command) {
JavierGC 0:2e1b2d9fa0de 277 case 0: //request from PC
JavierGC 0:2e1b2d9fa0de 278 CANMessage CanMess;
JavierGC 0:2e1b2d9fa0de 279 switch (mail->message[0]) {
JavierGC 0:2e1b2d9fa0de 280 case 'T':
JavierGC 0:2e1b2d9fa0de 281 float seconds;
JavierGC 0:2e1b2d9fa0de 282 sscanf(&mail->message[1],"%f",&seconds);
JavierGC 0:2e1b2d9fa0de 283 set_time((double)seconds);
JavierGC 0:2e1b2d9fa0de 284 time_t ctTime;
JavierGC 0:2e1b2d9fa0de 285 ctTime = time(NULL);
JavierGC 0:2e1b2d9fa0de 286 snprintf(mess,MessSizePC,"%s",ctime(&ctTime));
JavierGC 0:2e1b2d9fa0de 287 LoadPCMail(1,mess);
JavierGC 0:2e1b2d9fa0de 288 break;
JavierGC 0:2e1b2d9fa0de 289 case 'C': //CAN
JavierGC 0:2e1b2d9fa0de 290 switch (mail->message[1]) {
JavierGC 0:2e1b2d9fa0de 291 case '1': //CAN1, Send from PC a Message to CAN1
JavierGC 0:2e1b2d9fa0de 292 switch (mail->message[2]) {
JavierGC 0:2e1b2d9fa0de 293 case 'R': //reset CAN
JavierGC 0:2e1b2d9fa0de 294 LoadCAN1Mail(0,CanMess);
JavierGC 0:2e1b2d9fa0de 295 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 296 break;
JavierGC 0:2e1b2d9fa0de 297 case 'F': //set Frequency CAN
JavierGC 0:2e1b2d9fa0de 298 sscanf(&mail->message[3],"%i",&CanMess.id);
JavierGC 0:2e1b2d9fa0de 299 LoadCAN1Mail(1,CanMess);
JavierGC 0:2e1b2d9fa0de 300 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 301 break;
JavierGC 0:2e1b2d9fa0de 302 case 'W': //Write CAN
JavierGC 0:2e1b2d9fa0de 303 sscanf(&mail->message[3],"%i;%i;%i;%u;%u;%u;%u;%u;%u;%u;%u;%u",&CanMess.id,&CanMess.type,&CanMess.format,&CanMess.len,&CanMess.data[0],&CanMess.data[1],&CanMess.data[2],&CanMess.data[3],&CanMess.data[4],&CanMess.data[5],&CanMess.data[6],&CanMess.data[7]);
JavierGC 0:2e1b2d9fa0de 304 LoadCAN1Mail(20,CanMess);
JavierGC 0:2e1b2d9fa0de 305 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 306 break;
JavierGC 0:2e1b2d9fa0de 307 default:
JavierGC 0:2e1b2d9fa0de 308 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 309 break;
JavierGC 0:2e1b2d9fa0de 310 }
JavierGC 0:2e1b2d9fa0de 311 break;
JavierGC 0:2e1b2d9fa0de 312 case '2': //CAN2, Send from PC a Message to CAN2
JavierGC 0:2e1b2d9fa0de 313 switch (mail->message[2]) {
JavierGC 0:2e1b2d9fa0de 314 case 'R': //reset CAN
JavierGC 0:2e1b2d9fa0de 315 LoadCAN2Mail(0,CanMess);
JavierGC 0:2e1b2d9fa0de 316 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 317 break;
JavierGC 0:2e1b2d9fa0de 318 case 'F': //set Frequency CAN
JavierGC 0:2e1b2d9fa0de 319 sscanf(&mail->message[3],"%i",&CanMess.id);
JavierGC 0:2e1b2d9fa0de 320 LoadCAN2Mail(1,CanMess);
JavierGC 0:2e1b2d9fa0de 321 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 322 break;
JavierGC 0:2e1b2d9fa0de 323 case 'W': //Write CAN
JavierGC 0:2e1b2d9fa0de 324 sscanf(&mail->message[3],"%i;%i;%i;%u;%u;%u;%u;%u;%u;%u;%u;%u",&CanMess.id,&CanMess.type,&CanMess.format,&CanMess.len,&CanMess.data[0],&CanMess.data[1],&CanMess.data[2],&CanMess.data[3],&CanMess.data[4],&CanMess.data[5],&CanMess.data[6],&CanMess.data[7]);
JavierGC 0:2e1b2d9fa0de 325 LoadCAN2Mail(20,CanMess);
JavierGC 0:2e1b2d9fa0de 326 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 327 break;
JavierGC 0:2e1b2d9fa0de 328 default:
JavierGC 0:2e1b2d9fa0de 329 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 330 break;
JavierGC 0:2e1b2d9fa0de 331 }
JavierGC 0:2e1b2d9fa0de 332 break;
JavierGC 0:2e1b2d9fa0de 333 default:
JavierGC 0:2e1b2d9fa0de 334 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 335 break;
JavierGC 0:2e1b2d9fa0de 336 }
JavierGC 0:2e1b2d9fa0de 337 break;
JavierGC 0:2e1b2d9fa0de 338 case 'F': //Frequencies
JavierGC 0:2e1b2d9fa0de 339 switch (mail->message[1]) {
JavierGC 0:2e1b2d9fa0de 340 case '1': //Freq1, Get Freq11
JavierGC 0:2e1b2d9fa0de 341 snprintf(mess,MessSizePC,"F1= %i usec\r\n",Period1);
JavierGC 0:2e1b2d9fa0de 342 break;
JavierGC 0:2e1b2d9fa0de 343 case '2': //Freq2, Get Freq2
JavierGC 0:2e1b2d9fa0de 344 snprintf(mess,MessSizePC,"F2= %i usec\r\n",Period2);
JavierGC 0:2e1b2d9fa0de 345 break;
JavierGC 0:2e1b2d9fa0de 346 case '3': //Freq3, Get Freq3
JavierGC 0:2e1b2d9fa0de 347 snprintf(mess,MessSizePC,"F3= %i usec\r\n",Period3);
JavierGC 0:2e1b2d9fa0de 348 break;
JavierGC 0:2e1b2d9fa0de 349 default:
JavierGC 0:2e1b2d9fa0de 350 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 351 break;
JavierGC 0:2e1b2d9fa0de 352 }
JavierGC 0:2e1b2d9fa0de 353 break;
JavierGC 0:2e1b2d9fa0de 354 case 'P':
JavierGC 0:2e1b2d9fa0de 355 float duty=0;
JavierGC 0:2e1b2d9fa0de 356 int periodus=0;
JavierGC 0:2e1b2d9fa0de 357 switch (mail->message[1]) {
JavierGC 0:2e1b2d9fa0de 358 case '1':
JavierGC 0:2e1b2d9fa0de 359 sscanf(&mail->message[2],"%f;%i",&duty,&periodus);
JavierGC 0:2e1b2d9fa0de 360 PwmO1.write(duty);
JavierGC 0:2e1b2d9fa0de 361 PwmO1.period_us(periodus);
JavierGC 0:2e1b2d9fa0de 362 snprintf (mess,MessSizePC,"ACK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 363 break;
JavierGC 0:2e1b2d9fa0de 364 default:
JavierGC 0:2e1b2d9fa0de 365 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 366 break;
JavierGC 0:2e1b2d9fa0de 367 }
JavierGC 0:2e1b2d9fa0de 368 break;
JavierGC 0:2e1b2d9fa0de 369 case 'R':
JavierGC 0:2e1b2d9fa0de 370 if(strcmp(mail->message,"REBOOT")==0) {
JavierGC 0:2e1b2d9fa0de 371 mbed_reset();//wd.Configure(2.0);
JavierGC 0:2e1b2d9fa0de 372 } else {
JavierGC 0:2e1b2d9fa0de 373 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 374 }
JavierGC 0:2e1b2d9fa0de 375 break;
JavierGC 0:2e1b2d9fa0de 376 case 'r':
JavierGC 0:2e1b2d9fa0de 377 if(strcmp(mail->message,"reboot")==0) {
JavierGC 0:2e1b2d9fa0de 378 mbed_reset();//wd.Configure(2.0);
JavierGC 0:2e1b2d9fa0de 379 } else {
JavierGC 0:2e1b2d9fa0de 380 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 381 }
JavierGC 0:2e1b2d9fa0de 382 break;
JavierGC 0:2e1b2d9fa0de 383 default:
JavierGC 0:2e1b2d9fa0de 384 snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message);
JavierGC 0:2e1b2d9fa0de 385 break;
JavierGC 0:2e1b2d9fa0de 386 }
JavierGC 0:2e1b2d9fa0de 387 break;
JavierGC 0:2e1b2d9fa0de 388 case 1: //Send LOG to PC
JavierGC 0:2e1b2d9fa0de 389 if(LOGPC) {
JavierGC 0:2e1b2d9fa0de 390 snprintf(mess,MessSizePC,"LOG(%s):%s\r\n",Tstr ,mail->message);
JavierGC 0:2e1b2d9fa0de 391 } else {
JavierGC 0:2e1b2d9fa0de 392 mess[0]=0;
JavierGC 0:2e1b2d9fa0de 393 }
JavierGC 0:2e1b2d9fa0de 394 break;
JavierGC 0:2e1b2d9fa0de 395 case 2: //Send to PC a Message from CAN1
JavierGC 0:2e1b2d9fa0de 396 snprintf(mess,MessSizePC,"CAN1:%s\r\n",mail->message);
JavierGC 0:2e1b2d9fa0de 397 break;
JavierGC 0:2e1b2d9fa0de 398 case 3: //Send to PC a Message from CAN2
JavierGC 0:2e1b2d9fa0de 399 snprintf(mess,MessSizePC,"CAN2:%s\r\n",mail->message);
JavierGC 0:2e1b2d9fa0de 400 break;
JavierGC 0:2e1b2d9fa0de 401 default:
JavierGC 0:2e1b2d9fa0de 402 break;
JavierGC 0:2e1b2d9fa0de 403 }
JavierGC 0:2e1b2d9fa0de 404 PC_mail.free(mail);
JavierGC 0:2e1b2d9fa0de 405 PCMailNum--;
JavierGC 0:2e1b2d9fa0de 406 ledPC=false;
JavierGC 0:2e1b2d9fa0de 407 ComPC_Write(mess);
JavierGC 0:2e1b2d9fa0de 408 }
JavierGC 0:2e1b2d9fa0de 409 }
JavierGC 0:2e1b2d9fa0de 410 }
JavierGC 0:2e1b2d9fa0de 411 /************* END RS232 PC **************/
JavierGC 0:2e1b2d9fa0de 412
JavierGC 0:2e1b2d9fa0de 413 void GetConfig()
JavierGC 0:2e1b2d9fa0de 414 {
JavierGC 0:2e1b2d9fa0de 415
JavierGC 0:2e1b2d9fa0de 416 #define CfgNumParam 6
JavierGC 0:2e1b2d9fa0de 417 #define CfgSizeParam 50
JavierGC 0:2e1b2d9fa0de 418
JavierGC 0:2e1b2d9fa0de 419 pc.format(8,Serial::Even,1);
JavierGC 0:2e1b2d9fa0de 420 pc.baud(115200);
JavierGC 0:2e1b2d9fa0de 421 ConfigFile cfg;
JavierGC 0:2e1b2d9fa0de 422 LocalFileSystem local("local");
JavierGC 0:2e1b2d9fa0de 423
JavierGC 0:2e1b2d9fa0de 424 int i;
JavierGC 0:2e1b2d9fa0de 425 char value[CfgNumParam][CfgSizeParam];
JavierGC 0:2e1b2d9fa0de 426 char CfgK[CfgNumParam][CfgSizeParam]= {"InitialMessage","BaudRate","ChEnd","LOGPC","CAN1Freq","CAN2Freq"};
JavierGC 0:2e1b2d9fa0de 427
JavierGC 0:2e1b2d9fa0de 428 pc.printf("\r\n* * *\r\n* * *\r\n");
JavierGC 0:2e1b2d9fa0de 429
JavierGC 0:2e1b2d9fa0de 430 if (!cfg.read("/local/config.cfg")) {
JavierGC 0:2e1b2d9fa0de 431 error("\r\nFailure to read a configuration file");
JavierGC 0:2e1b2d9fa0de 432 }
JavierGC 0:2e1b2d9fa0de 433 char Tstr[10];
JavierGC 0:2e1b2d9fa0de 434 for (i=0; i<CfgNumParam; i++) {
JavierGC 0:2e1b2d9fa0de 435 if (cfg.getValue(CfgK[i], &value[i][0], sizeof(value[i]))) {
JavierGC 0:2e1b2d9fa0de 436 TLogSTR(Tstr);
JavierGC 0:2e1b2d9fa0de 437 pc.printf("CFG_Param(%s): '%s'='%s'\r\n", Tstr,CfgK[i], value[i]);
JavierGC 0:2e1b2d9fa0de 438 } else {
JavierGC 0:2e1b2d9fa0de 439 error("Failure Reading '%s'\r\n", CfgK[i]);
JavierGC 0:2e1b2d9fa0de 440 }
JavierGC 0:2e1b2d9fa0de 441 }
JavierGC 0:2e1b2d9fa0de 442 strcpy(InitialMessage,value[0]);
JavierGC 0:2e1b2d9fa0de 443 BaudRate=atoi(value[1]);
JavierGC 0:2e1b2d9fa0de 444 ChEnd=(char)atoi(value[2]);
JavierGC 0:2e1b2d9fa0de 445 LOGPC=(bool)atoi(value[3]);
JavierGC 0:2e1b2d9fa0de 446 CAN1Freq=atoi(value[4]);
JavierGC 0:2e1b2d9fa0de 447 CAN2Freq=atoi(value[5]);
JavierGC 0:2e1b2d9fa0de 448
JavierGC 0:2e1b2d9fa0de 449 TxBufferWait= 10000*MessSizePC/BaudRate;
JavierGC 0:2e1b2d9fa0de 450
JavierGC 0:2e1b2d9fa0de 451 pc.printf("* * *\r\n* * *\r\n");
JavierGC 0:2e1b2d9fa0de 452
JavierGC 0:2e1b2d9fa0de 453 while(!pc.txBufferEmpty()) {
JavierGC 0:2e1b2d9fa0de 454 Thread::wait(100);
JavierGC 0:2e1b2d9fa0de 455 };
JavierGC 0:2e1b2d9fa0de 456 }
JavierGC 0:2e1b2d9fa0de 457
JavierGC 0:2e1b2d9fa0de 458 int main()
JavierGC 0:2e1b2d9fa0de 459 {
JavierGC 0:2e1b2d9fa0de 460
JavierGC 0:2e1b2d9fa0de 461 //char tempMessPC[MessSizePC];
JavierGC 0:2e1b2d9fa0de 462 PCMailNum=0;
JavierGC 0:2e1b2d9fa0de 463 GetConfig();
JavierGC 0:2e1b2d9fa0de 464
JavierGC 0:2e1b2d9fa0de 465 // ************ PC ^^^^^^^^^^^^^
JavierGC 0:2e1b2d9fa0de 466 pc.baud(BaudRate);
JavierGC 0:2e1b2d9fa0de 467 Thread ComPC_thread (ComPC_thread_proc,NULL,osPriorityBelowNormal);
JavierGC 0:2e1b2d9fa0de 468 pc.attach(&messageFromPC, MODSERIAL::RxAutoDetect);
JavierGC 0:2e1b2d9fa0de 469 pc.autoDetectChar(ChEnd);
JavierGC 0:2e1b2d9fa0de 470
JavierGC 0:2e1b2d9fa0de 471 // ************ PC_end ^^^^^^^^^^^^^
JavierGC 0:2e1b2d9fa0de 472
JavierGC 0:2e1b2d9fa0de 473 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 474 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 475 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 476 LoadPCMail(1,"*****************************");
JavierGC 0:2e1b2d9fa0de 477 LoadPCMail(1,InitialMessage);
JavierGC 0:2e1b2d9fa0de 478 LoadPCMail(1,"*****************************");
JavierGC 0:2e1b2d9fa0de 479 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 480 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 481 LoadPCMail(1,"");
JavierGC 0:2e1b2d9fa0de 482
JavierGC 0:2e1b2d9fa0de 483 // ************ CAN1 ^^^^^^^^^^^
JavierGC 0:2e1b2d9fa0de 484 Thread CAN1_thread (CAN1_thread_proc,NULL,osPriorityNormal);
JavierGC 0:2e1b2d9fa0de 485 can1.frequency(CAN1Freq);
JavierGC 0:2e1b2d9fa0de 486 can1.attach(&messageFromCAN1);
JavierGC 0:2e1b2d9fa0de 487 // ************ CAN1_end ^^^^^^^
JavierGC 0:2e1b2d9fa0de 488
JavierGC 0:2e1b2d9fa0de 489 // ************ CAN2 ^^^^^^^^^^^
JavierGC 0:2e1b2d9fa0de 490 Thread CAN2_thread (CAN2_thread_proc,NULL,osPriorityNormal);
JavierGC 0:2e1b2d9fa0de 491 can2.frequency(CAN2Freq);
JavierGC 0:2e1b2d9fa0de 492 can2.attach(&messageFromCAN2);
JavierGC 0:2e1b2d9fa0de 493 // ************ CAN2_end ^^^^^^^
JavierGC 0:2e1b2d9fa0de 494
JavierGC 0:2e1b2d9fa0de 495 // ************ WD *************
JavierGC 0:2e1b2d9fa0de 496 wd.WatchdogCausedReset();
JavierGC 0:2e1b2d9fa0de 497 wd.Configure(5.0);
JavierGC 0:2e1b2d9fa0de 498 // ************ WD_end *********
JavierGC 0:2e1b2d9fa0de 499
JavierGC 0:2e1b2d9fa0de 500 // ************ Interrupts Freqs
JavierGC 0:2e1b2d9fa0de 501 F1.start();
JavierGC 0:2e1b2d9fa0de 502 F2.start();
JavierGC 0:2e1b2d9fa0de 503 F3.start();
JavierGC 0:2e1b2d9fa0de 504 Period1=0;
JavierGC 0:2e1b2d9fa0de 505 Period2=0;
JavierGC 0:2e1b2d9fa0de 506 Period3=0;
JavierGC 0:2e1b2d9fa0de 507
JavierGC 0:2e1b2d9fa0de 508 Freq1.rise(Freq1_Meas);
JavierGC 0:2e1b2d9fa0de 509 Freq2.rise(Freq2_Meas);
JavierGC 0:2e1b2d9fa0de 510 Freq3.rise(Freq3_Meas);
JavierGC 0:2e1b2d9fa0de 511
JavierGC 0:2e1b2d9fa0de 512 // ************ End Interrupts Freqs
JavierGC 0:2e1b2d9fa0de 513
JavierGC 0:2e1b2d9fa0de 514 while(true) {
JavierGC 0:2e1b2d9fa0de 515 //Thread::wait(osWaitForever);
JavierGC 0:2e1b2d9fa0de 516 wd.Service();
JavierGC 0:2e1b2d9fa0de 517 Thread::wait(1000);
JavierGC 0:2e1b2d9fa0de 518 }
JavierGC 0:2e1b2d9fa0de 519 }