JGtoJR

Dependencies:   MODSERIAL Watchdog

Committer:
JavierGC
Date:
Thu Jun 15 12:01:36 2017 +0000
Revision:
0:1c1c9f47b8ad
JG_to_JR

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JavierGC 0:1c1c9f47b8ad 1 #include "PC.h"
JavierGC 0:1c1c9f47b8ad 2
JavierGC 0:1c1c9f47b8ad 3 /***** Definitions *****/
JavierGC 0:1c1c9f47b8ad 4
JavierGC 0:1c1c9f47b8ad 5 //******************************************************************************
JavierGC 0:1c1c9f47b8ad 6 PC::PC(GV *_pgv, PinName _led, PinName tx, PinName rx) : MODSERIAL( tx, rx, PCTxBufferSize, PCRxBufferSize, NULL )
JavierGC 0:1c1c9f47b8ad 7 {
JavierGC 0:1c1c9f47b8ad 8 pgv=_pgv;
JavierGC 0:1c1c9f47b8ad 9 iEvent=NULL;
JavierGC 0:1c1c9f47b8ad 10 led=NULL;
JavierGC 0:1c1c9f47b8ad 11
JavierGC 0:1c1c9f47b8ad 12 MailNum=0;
JavierGC 0:1c1c9f47b8ad 13 LOG=false;
JavierGC 0:1c1c9f47b8ad 14 SendStatus=false;
JavierGC 0:1c1c9f47b8ad 15 mode=0;
JavierGC 0:1c1c9f47b8ad 16
JavierGC 0:1c1c9f47b8ad 17 if(_led!=NC) led=new DigitalOut(_led);
JavierGC 0:1c1c9f47b8ad 18 baud(PCBaudRateDef);
JavierGC 0:1c1c9f47b8ad 19 format(8,SerialBase::None,1);
JavierGC 0:1c1c9f47b8ad 20 autoDetectChar('\r');
JavierGC 0:1c1c9f47b8ad 21 this->attach(this,&PC::messageFrom, MODSERIAL::RxAutoDetect);
JavierGC 0:1c1c9f47b8ad 22 }
JavierGC 0:1c1c9f47b8ad 23
JavierGC 0:1c1c9f47b8ad 24 void PC::start(void)
JavierGC 0:1c1c9f47b8ad 25 {
JavierGC 0:1c1c9f47b8ad 26 thread.start(this,&PC::Paralell_thread);
JavierGC 0:1c1c9f47b8ad 27 }
JavierGC 0:1c1c9f47b8ad 28
JavierGC 0:1c1c9f47b8ad 29 PC::PC(GV *_pgv, PinName _led, PinName tx, PinName rx, void (*iEventHandler)(int, char *)) : MODSERIAL( tx, rx, PCTxBufferSize, PCRxBufferSize, NULL )
JavierGC 0:1c1c9f47b8ad 30 {
JavierGC 0:1c1c9f47b8ad 31 pgv=_pgv;
JavierGC 0:1c1c9f47b8ad 32 iEvent=iEventHandler;
JavierGC 0:1c1c9f47b8ad 33 led=NULL;
JavierGC 0:1c1c9f47b8ad 34
JavierGC 0:1c1c9f47b8ad 35 MailNum=0;
JavierGC 0:1c1c9f47b8ad 36 LOG=false;
JavierGC 0:1c1c9f47b8ad 37 SendStatus=false;
JavierGC 0:1c1c9f47b8ad 38 mode=0;
JavierGC 0:1c1c9f47b8ad 39
JavierGC 0:1c1c9f47b8ad 40 if(_led!=NC) led=new DigitalOut(_led);
JavierGC 0:1c1c9f47b8ad 41 baud(PCBaudRateDef);
JavierGC 0:1c1c9f47b8ad 42 format(8,SerialBase::None,1);
JavierGC 0:1c1c9f47b8ad 43 autoDetectChar('\r');
JavierGC 0:1c1c9f47b8ad 44 this->attach(this,&PC::messageFrom, MODSERIAL::RxAutoDetect);
JavierGC 0:1c1c9f47b8ad 45 }
JavierGC 0:1c1c9f47b8ad 46
JavierGC 0:1c1c9f47b8ad 47 //******************************************************************************
JavierGC 0:1c1c9f47b8ad 48 PC::~PC()
JavierGC 0:1c1c9f47b8ad 49 {
JavierGC 0:1c1c9f47b8ad 50 }
JavierGC 0:1c1c9f47b8ad 51
JavierGC 0:1c1c9f47b8ad 52 //******************************************************************************
JavierGC 0:1c1c9f47b8ad 53
JavierGC 0:1c1c9f47b8ad 54 void PC::messageFrom(MODSERIAL_IRQ_INFO *q) {
JavierGC 0:1c1c9f47b8ad 55 MODSERIAL *sys = q->serial;
JavierGC 0:1c1c9f47b8ad 56 int i=sys->move(messageBufferIncoming, PCTxBufferSize);
JavierGC 0:1c1c9f47b8ad 57 messageBufferIncoming[i]='\r';
JavierGC 0:1c1c9f47b8ad 58 messageBufferIncoming[i+1]=0;
JavierGC 0:1c1c9f47b8ad 59 LoadMail(0,messageBufferIncoming);
JavierGC 0:1c1c9f47b8ad 60
JavierGC 0:1c1c9f47b8ad 61 if(led!=NULL)
JavierGC 0:1c1c9f47b8ad 62 {
JavierGC 0:1c1c9f47b8ad 63 led->write(true);
JavierGC 0:1c1c9f47b8ad 64 wait_us(250);
JavierGC 0:1c1c9f47b8ad 65 led->write(false);
JavierGC 0:1c1c9f47b8ad 66 }
JavierGC 0:1c1c9f47b8ad 67 //sys->rxBufferFlush();
JavierGC 0:1c1c9f47b8ad 68 }
JavierGC 0:1c1c9f47b8ad 69
JavierGC 0:1c1c9f47b8ad 70 void PC::StatusToPC(void)
JavierGC 0:1c1c9f47b8ad 71 {
JavierGC 0:1c1c9f47b8ad 72 if(SendStatus)
JavierGC 0:1c1c9f47b8ad 73 {
JavierGC 0:1c1c9f47b8ad 74 char tempMessPC[PCTxBufferSize];
JavierGC 0:1c1c9f47b8ad 75 sprintf(tempMessPC,"%.1f\r",pgv->Variable1);
JavierGC 0:1c1c9f47b8ad 76 LoadMail(2,tempMessPC);
JavierGC 0:1c1c9f47b8ad 77 }
JavierGC 0:1c1c9f47b8ad 78 }
JavierGC 0:1c1c9f47b8ad 79
JavierGC 0:1c1c9f47b8ad 80 void PC::Paralell_thread()
JavierGC 0:1c1c9f47b8ad 81 {
JavierGC 0:1c1c9f47b8ad 82 while(true)
JavierGC 0:1c1c9f47b8ad 83 {
JavierGC 0:1c1c9f47b8ad 84 char mess[PCTxBufferSize];
JavierGC 0:1c1c9f47b8ad 85 char Tstr[20];
JavierGC 0:1c1c9f47b8ad 86 osEvent evt = mails.get(osWaitForever);
JavierGC 0:1c1c9f47b8ad 87 if (evt.status == osEventMail)
JavierGC 0:1c1c9f47b8ad 88 {
JavierGC 0:1c1c9f47b8ad 89 mail_t *mail = (mail_t*)evt.value.p;
JavierGC 0:1c1c9f47b8ad 90 switch (mail->command)
JavierGC 0:1c1c9f47b8ad 91 {
JavierGC 0:1c1c9f47b8ad 92 case 0: //request from PC
JavierGC 0:1c1c9f47b8ad 93 switch (mail->message[0])
JavierGC 0:1c1c9f47b8ad 94 {
JavierGC 0:1c1c9f47b8ad 95 case '@': //command to PC
JavierGC 0:1c1c9f47b8ad 96 switch(mail->message[1])
JavierGC 0:1c1c9f47b8ad 97 {
JavierGC 0:1c1c9f47b8ad 98 case 'L':
JavierGC 0:1c1c9f47b8ad 99 LOG=mail->message[2]=='1';
JavierGC 0:1c1c9f47b8ad 100 break;
JavierGC 0:1c1c9f47b8ad 101 case 'S':
JavierGC 0:1c1c9f47b8ad 102 SendStatus=mail->message[2]=='1';
JavierGC 0:1c1c9f47b8ad 103 if(SendStatus) TStatusToPC.attach(this,&PC::StatusToPC, Rate);
JavierGC 0:1c1c9f47b8ad 104 else TStatusToPC.detach();
JavierGC 0:1c1c9f47b8ad 105 break;
JavierGC 0:1c1c9f47b8ad 106 case 'M':
JavierGC 0:1c1c9f47b8ad 107 char temp[20];
JavierGC 0:1c1c9f47b8ad 108 temp[0]=mail->message[2];
JavierGC 0:1c1c9f47b8ad 109 temp[1]=0;
JavierGC 0:1c1c9f47b8ad 110 mode=atoi(temp);
JavierGC 0:1c1c9f47b8ad 111 break;
JavierGC 0:1c1c9f47b8ad 112 case 'R'://Reboot
JavierGC 0:1c1c9f47b8ad 113 mbed_reset();//wd.Configure(2.0);
JavierGC 0:1c1c9f47b8ad 114 break;
JavierGC 0:1c1c9f47b8ad 115 case 'r'://Reboot
JavierGC 0:1c1c9f47b8ad 116 mbed_reset();//wd.Configure(2.0);
JavierGC 0:1c1c9f47b8ad 117 break;
JavierGC 0:1c1c9f47b8ad 118 case 'H':
JavierGC 0:1c1c9f47b8ad 119 time_t rawtime;
JavierGC 0:1c1c9f47b8ad 120 struct tm * timeinfo;
JavierGC 0:1c1c9f47b8ad 121 int year, month, day, hour, minute, second;
JavierGC 0:1c1c9f47b8ad 122 sscanf(&mail->message[2],"%02d%02d%02d%02d%02d%04d",&hour,&minute,&second,&day,&month,&year);
JavierGC 0:1c1c9f47b8ad 123 /* get current timeinfo and modify it to the user's choice */
JavierGC 0:1c1c9f47b8ad 124 time ( &rawtime );
JavierGC 0:1c1c9f47b8ad 125 timeinfo = localtime ( &rawtime );
JavierGC 0:1c1c9f47b8ad 126 timeinfo->tm_year = year-1900;
JavierGC 0:1c1c9f47b8ad 127 timeinfo->tm_mon = month - 1;
JavierGC 0:1c1c9f47b8ad 128 timeinfo->tm_mday = day;
JavierGC 0:1c1c9f47b8ad 129 timeinfo->tm_hour = hour;
JavierGC 0:1c1c9f47b8ad 130 timeinfo->tm_min = minute;
JavierGC 0:1c1c9f47b8ad 131 timeinfo->tm_sec = second;
JavierGC 0:1c1c9f47b8ad 132 /* call mktime: timeinfo->tm_wday will be set */
JavierGC 0:1c1c9f47b8ad 133 rawtime=mktime (timeinfo);
JavierGC 0:1c1c9f47b8ad 134 set_time(rawtime);
JavierGC 0:1c1c9f47b8ad 135 break;
JavierGC 0:1c1c9f47b8ad 136 default:
JavierGC 0:1c1c9f47b8ad 137 break;
JavierGC 0:1c1c9f47b8ad 138 }
JavierGC 0:1c1c9f47b8ad 139 break;
JavierGC 0:1c1c9f47b8ad 140 default: //
JavierGC 0:1c1c9f47b8ad 141 switch (mode)
JavierGC 0:1c1c9f47b8ad 142 {
JavierGC 0:1c1c9f47b8ad 143 default:
JavierGC 0:1c1c9f47b8ad 144 mode=0;
JavierGC 0:1c1c9f47b8ad 145 break;
JavierGC 0:1c1c9f47b8ad 146 }
JavierGC 0:1c1c9f47b8ad 147 break;
JavierGC 0:1c1c9f47b8ad 148 }
JavierGC 0:1c1c9f47b8ad 149 break;
JavierGC 0:1c1c9f47b8ad 150 case 1: //Send LOG to PC
JavierGC 0:1c1c9f47b8ad 151 TLogSTR(Tstr);
JavierGC 0:1c1c9f47b8ad 152 snprintf(mess,PCTxBufferSize,"LOG(%s):%s",Tstr ,mail->message);
JavierGC 0:1c1c9f47b8ad 153 Com_Write(mess);
JavierGC 0:1c1c9f47b8ad 154 break;
JavierGC 0:1c1c9f47b8ad 155 case 2: //Send to PC
JavierGC 0:1c1c9f47b8ad 156 Com_Write(mail->message);
JavierGC 0:1c1c9f47b8ad 157 break;
JavierGC 0:1c1c9f47b8ad 158 default:
JavierGC 0:1c1c9f47b8ad 159 break;
JavierGC 0:1c1c9f47b8ad 160 }
JavierGC 0:1c1c9f47b8ad 161 mails.free(mail);
JavierGC 0:1c1c9f47b8ad 162 MailNum--;
JavierGC 0:1c1c9f47b8ad 163 }
JavierGC 0:1c1c9f47b8ad 164 }
JavierGC 0:1c1c9f47b8ad 165 }
JavierGC 0:1c1c9f47b8ad 166
JavierGC 0:1c1c9f47b8ad 167 void PC::TLogSTR(char *Tstr)
JavierGC 0:1c1c9f47b8ad 168 {
JavierGC 0:1c1c9f47b8ad 169 time_t ctTime;
JavierGC 0:1c1c9f47b8ad 170 struct tm * timeinfo;
JavierGC 0:1c1c9f47b8ad 171
JavierGC 0:1c1c9f47b8ad 172 ctTime = time(NULL);
JavierGC 0:1c1c9f47b8ad 173 timeinfo = localtime ( &ctTime );
JavierGC 0:1c1c9f47b8ad 174 strftime (Tstr,PCTxBufferSize,"%H:%M:%S",timeinfo);
JavierGC 0:1c1c9f47b8ad 175 }
JavierGC 0:1c1c9f47b8ad 176
JavierGC 0:1c1c9f47b8ad 177 void PC::LoadMail(char comm, char *mess) //para cargar mensajes de trabajo al proceso paralelo ComPC_thread_proc
JavierGC 0:1c1c9f47b8ad 178 {
JavierGC 0:1c1c9f47b8ad 179 if(comm!=1 || LOG)
JavierGC 0:1c1c9f47b8ad 180 {
JavierGC 0:1c1c9f47b8ad 181 while(MailNum>=PCMaxMailElements) wait_us(PCWaitMess_us);
JavierGC 0:1c1c9f47b8ad 182 mail_t *pmail = mails.alloc();
JavierGC 0:1c1c9f47b8ad 183 pmail->command = comm;
JavierGC 0:1c1c9f47b8ad 184 snprintf(pmail->message,PCTxBufferSize,"%s",mess);
JavierGC 0:1c1c9f47b8ad 185 mails.put(pmail);
JavierGC 0:1c1c9f47b8ad 186 MailNum++;
JavierGC 0:1c1c9f47b8ad 187 }
JavierGC 0:1c1c9f47b8ad 188 }
JavierGC 0:1c1c9f47b8ad 189
JavierGC 0:1c1c9f47b8ad 190 int PC::Com_Write(char *mess) //sólo para usarse en ComPC_thread_proc
JavierGC 0:1c1c9f47b8ad 191 {
JavierGC 0:1c1c9f47b8ad 192 int i=strlen(mess);
JavierGC 0:1c1c9f47b8ad 193 if(i>0) {
JavierGC 0:1c1c9f47b8ad 194 while((PCTxBufferSize-this->txBufferGetCount())<i) wait_us(PCWaitByte_us);
JavierGC 0:1c1c9f47b8ad 195 return this->printf(mess);
JavierGC 0:1c1c9f47b8ad 196 }
JavierGC 0:1c1c9f47b8ad 197 return 0;
JavierGC 0:1c1c9f47b8ad 198 }