Serial Library STE
Dependencies: mbed mbed-rtos MODSERIAL
Revision 0:7077a789f16a, committed 2020-12-23
- Comitter:
- JavierGC
- Date:
- Wed Dec 23 08:54:49 2020 +0000
- Commit message:
- Serial Library STE
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/AjK/code/MODSERIAL/#ae0408ebdd68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PC/PC.cpp Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,166 @@ +#include "PC.h" + +/***** Definitions *****/ + +//****************************************************************************** +PC::PC(PinName _led, PinName tx, PinName rx) : MODSERIAL( tx, rx, PCTxBufferSize, PCRxBufferSize, NULL ) +{ + + led=NULL; + + MailNum=0; + + if(_led!=NC) led=new DigitalOut(_led); + baud(PCBaudRateDef); + format(8,SerialBase::None,1); + autoDetectChar('\n'); + this->attach(this,&PC::messageFrom, MODSERIAL::RxAutoDetect); +} + +PC::PC(PinName _led, PinName tx, PinName rx, void (*iEventHandler)(int, char *)) : MODSERIAL( tx, rx, PCTxBufferSize, PCRxBufferSize, NULL ) +{ + + iEvent=iEventHandler; + led=NULL; + + MailNum=0; + + + if(_led!=NC) led=new DigitalOut(_led); + baud(PCBaudRateDef); + format(8,SerialBase::None,1); + autoDetectChar('\n'); + this->attach(this,&PC::messageFrom, MODSERIAL::RxAutoDetect); +} + +void PC::start(void) +{ + thread.start(this,&PC::Paralell_thread); +} + +//****************************************************************************** +PC::~PC() +{ +} + +//****************************************************************************** + +void PC::messageFrom(MODSERIAL_IRQ_INFO *q) { + MODSERIAL *sys = q->serial; + int i=sys->move(messageBufferIncoming, PCTxBufferSize); + messageBufferIncoming[i]='\n'; + messageBufferIncoming[i+1]=0; + LoadMail(0,messageBufferIncoming); + + if(led!=NULL) + { + led->write(true); + wait_us(250); + led->write(false); + } + //sys->rxBufferFlush(); +} + +void PC::Paralell_thread() +{ + while(true) + { + char mess[PCTxBufferSize]; + char Tstr[20]; + osEvent evt = mails.get(osWaitForever); + if (evt.status == osEventMail) + { + mail_t *mail = (mail_t*)evt.value.p; + switch (mail->command) + { + case 0: //request from PC + switch (mail->message[0]) + { + + + case '@': //command to PC + switch(mail->message[1]) + { + case 'R'://Reboot + mbed_reset();//wd.Configure(2.0); + break; + case 'r'://Reboot + mbed_reset();//wd.Configure(2.0); + break; + default: + break; + } + break; + case '#': //command Pulses + switch(mail->message[1]) + { + case 'S'://State + if(iEvent!=NULL) iEvent(eState,&mail->message[2]); + break; + case 'P'://Pulse + if(iEvent!=NULL) iEvent(ePulse,&mail->message[2]); + break; + case 'M'://Pulse + if(iEvent!=NULL) iEvent(ePulsems,&mail->message[2]); + break; + case 's'://Pulse + if(iEvent!=NULL) iEvent(ePulses,&mail->message[2]); + break; + default: + break; + } + break; + default: // + break; + } + break; + case 1: //Send LOG to PC + TLogSTR(Tstr); + snprintf(mess,PCTxBufferSize,"LOG(%s):%s",Tstr ,mail->message); + Com_Write(mess); + break; + case 2: //Send to PC + Com_Write(mail->message); + break; + default: + break; + } + mails.free(mail); + MailNum--; + } + } +} + +void PC::TLogSTR(char *Tstr) +{ + time_t ctTime; + struct tm * timeinfo; + + ctTime = time(NULL); + timeinfo = localtime ( &ctTime ); + //timeinfo->tm_hour=(timeinfo->tm_hour+1)%24; + strftime (Tstr,PCTxBufferSize,"%H:%M:%S",timeinfo); +} + +void PC::LoadMail(char comm, char *mess) //para cargar mensajes de trabajo al proceso paralelo ComPC_thread_proc +{ + if(comm!=1) + { + while(MailNum>=PCMaxMailElements) wait_us(PCWaitMess_us); + mail_t *pmail = mails.alloc(); + pmail->command = comm; + snprintf(pmail->message,PCTxBufferSize,"%s",mess); + mails.put(pmail); + MailNum++; + } +} + +int PC::Com_Write(char *mess) //sólo para usarse en ComPC_thread_proc +{ + int i=strlen(mess); + if(i>0) { + while((PCTxBufferSize-this->txBufferGetCount())<i) wait_us(PCWaitByte_us); + return this->printf(mess); + } + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PC/PC.h Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,61 @@ +#ifndef _PC_H_ +#define _PC_H_ + +#include "mbed.h" +#include "rtos.h" +#include "MODSERIAL.h" + +#define PCTxBufferSize 200 +#define PCRxBufferSize 200 +#define PCMaxMailElements 8 +#define PCBaudRateDef 115200 +#define PCWaitByte_us (10000000/PCBaudRateDef) +#define PCWaitMess_us PCWaitByte_us*10 + +#define Rate 1 + +extern "C" void mbed_reset(); + +class PC : public MODSERIAL +{ + +public: + + + PC(PinName _led, PinName tx, PinName rx); + PC(PinName _led, PinName tx, PinName rx, void (*iEventHandler)(int, char *)); + void AttachSendStatus(void); + void DetachSendStatus(void); + ~PC(); + + void LoadMail(char comm, char *mess); //para cargar mensajes de trabajo al proceso paralelo ComPC_thread_proc + + void start(void); + enum MyEventsPC {eLOG=100, eState, ePulse, ePulsems, ePulses}; + +private: + + DigitalOut *led; + char messageBufferIncoming[PCRxBufferSize]; + char messageBufferOutgoing[PCTxBufferSize]; + + Thread thread; + + void (*iEvent)(int, char *); + + typedef struct { + char command; /* command to execute */ + char message[PCTxBufferSize]; /* arguments */ + } mail_t; + + void TLogSTR(char *Tstr); + Mail<mail_t, PCMaxMailElements> mails; + int MailNum; + + int Com_Write(char *mess); //sólo para usarse en ComPC_thread_proc + void messageFrom(MODSERIAL_IRQ_INFO *q); + void Paralell_thread(); + +}; + +#endif /* _PC_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,245 @@ +#include "main.h" + + +DigitalOut myled1(LED1); +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut d1(p21); +DigitalOut d2(p22); +DigitalOut d3(p23); +DigitalOut d4(p24); +DigitalOut d5(p25); +DigitalOut d6(p26); +DigitalOut d7(p27); + + +int main() { + pc.start(); + + + pc.LoadMail(2,"starting...\r"); + + wait_ms(100); // use this in place of wait() to exclude waiting time from + // your usage value. + + //wait_ms(100); + + Setup(); + //set_time(0); + + E=99999; + + + while(true) { + //d1=1; + //wait_ms(7); + //d1=0; + //wait_ms(7); + myled1 = 1; + wait(0.25); + myled1 = 0; + wait(0.25); + + switch(E) + { + case PC::eState: + + switch (DATA[0]) + { + case '1': + d1=(DATA[2]=='1'); + break; + case '2': + d2=(DATA[2]=='1'); + break; + case '3': + d3=(DATA[2]=='1'); + break; + case '4': + d4=(DATA[2]=='1'); + break; + case '5': + d5=(DATA[2]=='1'); + break; + case '6': + d6=(DATA[2]=='1'); + break; + case '7': + d7=(DATA[2]=='1'); + break; + default: + break; + } + E=99999; + break; + case PC::ePulse: + sscanf(DATA,"%[^;];%[^;]",&CMD[0],&DATO[0]); + switch (CMD[0]) + { + case '1': + d1=1; + wait_us(atoi(DATO)); + d1=0; + break; + case '2': + d2=1; + wait_us(atoi(DATO)); + d2=0; + break; + case '3': + d3=1; + wait_us(atoi(DATO)); + d3=0; + break; + case '4': + d4=1; + wait_us(atoi(DATO)); + d4=0; + break; + case '5': + d5=1; + wait_us(atoi(DATO)); + d5=0; + break; + case '6': + d6=1; + wait_us(atoi(DATO)); + d6=0; + break; + case '7': + d7=1; + wait_us(atoi(DATO)); + d7=0; + break; + default: + break; + } + E=99999; + break; + case PC::ePulsems: + sscanf(DATA,"%[^;];%[^;]",&CMD[0],&DATO[0]); + switch (CMD[0]) + { + case '1': + d1=1; + wait_ms(atoi(DATO)); + d1=0; + break; + case '2': + d2=1; + wait_ms(atoi(DATO)); + d2=0; + break; + case '3': + d3=1; + wait_ms(atoi(DATO)); + d3=0; + break; + case '4': + d4=1; + wait_ms(atoi(DATO)); + d4=0; + break; + case '5': + d5=1; + wait_ms(atoi(DATO)); + d5=0; + break; + case '6': + d6=1; + wait_ms(atoi(DATO)); + d6=0; + break; + case '7': + d7=1; + wait_ms(atoi(DATO)); + d7=0; + break; + default: + break; + } + E=99999; + break; + case PC::ePulses: + sscanf(DATA,"%[^;];%[^;]",&CMD[0],&DATO[0]); + switch (CMD[0]) + { + case '1': + d1=1; + wait(atof(DATO)); + d1=0; + break; + case '2': + d2=1; + wait(atof(DATO)); + d2=0; + break; + case '3': + d3=1; + wait(atof(DATO)); + d3=0; + break; + case '4': + d4=1; + wait(atof(DATO)); + d4=0; + break; + case '5': + d5=1; + wait_us(atof(DATO)); + d5=0; + break; + case '6': + d6=1; + wait_us(atof(DATO)); + d6=0; + break; + case '7': + d7=1; + wait_us(atof(DATO)); + d7=0; + break; + default: + break; + } + E=99999; + break; + default: + break; + } + } +} + + + + +void PCEventHandler(int e, char *data) +{ + if(E==99999) + { + E=e; + sprintf(DATA,"%s",data); + } +} + +void Setup() +{ + + //pc.AttachSendStatus(); + + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"************************************************"); + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"************************************************"); + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"\n"); + pc.LoadMail(2,"\n"); + + DigitalOut(LED1,0); + DigitalOut(LED2,0); + DigitalOut(LED3,0); + DigitalOut(LED4,0); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,23 @@ +#ifndef _main_H_ +#define _main_H_ + +#include "mbed.h" +#include "rtos.h" +#include "PC.h" + +Timer t; // create your timer object + +void PCEventHandler(int e, char *data); +PC pc(LED1, USBTX, USBRX, PCEventHandler); + +char CMD[5]; +char DATO[25]; +char DATA[25]; +int E; + +void Setup(void); +void UpdateStatus(void); + +extern "C" void mbed_reset(); + +#endif /* _main_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#5713cbbdb706
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Dec 23 08:54:49 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file