Serial Library STE

Dependencies:   mbed mbed-rtos MODSERIAL

Files at this revision

API Documentation at this revision

Comitter:
JavierGC
Date:
Wed Dec 23 08:54:49 2020 +0000
Commit message:
Serial Library STE

Changed in this revision

MODSERIAL.lib Show annotated file Show diff for this revision Revisions of this file
PC/PC.cpp Show annotated file Show diff for this revision Revisions of this file
PC/PC.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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