JGtoJR
Dependencies: MODSERIAL Watchdog
PC/PC.cpp@0:1c1c9f47b8ad, 2017-06-15 (annotated)
- Committer:
- JavierGC
- Date:
- Thu Jun 15 12:01:36 2017 +0000
- Revision:
- 0:1c1c9f47b8ad
JG_to_JR
Who changed what in which revision?
User | Revision | Line number | New 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 | } |