AVANCE PICCOLO CORTE 1

Dependencies:   mbed

main.cpp

Committer:
Camilokingxd
Date:
2018-03-17
Revision:
3:c3d197a71ecd
Parent:
2:274426ac7654

File content as of revision 3:c3d197a71ecd:

#include "mbed.h"
#include "def.h"

DigitalOut myled(LED1);

Serial pc(USBTX,USBRX);

PwmOut mypwmX(PB_4);
PwmOut mypwmY(PB_5);
PwmOut mypwmZ(PB_3);

uint32_t mem_head = 0; 
uint32_t mem_tail = 0; 
uint32_t full=0;

MEM_TYPE buffer[MEM_SIZE]; 

void mem_free() 
{
    mem_head=0;
    full=0;
    mem_tail=0;
}

uint32_t mem_put(MEM_TYPE data) // 
{
    if(full) 
    {
        return 1; // 
    }
    buffer [mem_head]=data; 
    mem_head+=1; 
    if(mem_head==MEM_SIZE)
    {
        full=1; 
    }
    return 0; 
}

uint32_t mem_get(MEM_TYPE* data) 
{
    if(mem_head == 0)
        return 1;
    if (mem_head == mem_tail) 
        return 1;
        
    *data=buffer[mem_tail]; 
    mem_tail +=1; 
    
    return 0;
}

void Vertex2D(uint8_t,uint8_t);
void SetZ(uint8_t);
uint8_t x,y,z;
int mm2pulse(float vmm); 
void program_serial();
void ejecutar();
int guardar();

int main()
{
    mypwmX.period_ms(20);
    mypwmY.period_ms(20);
    mypwmZ.period_ms(20);
    program_serial();
    uint8_t letra,subletra;
    Vertex2D(0,0);        
    SetZ(NODRAW);
    myled = 1;
    wait(2);
    while(1) 
    {
        pc.printf("ingrese comando \n");
        letra=pc.getc();              
        subletra=pc.getc();
        if(subletra==CM_STOP)
        {
            switch(letra)
            {
            case CM_EJECUTAR:
                if(mem_head!=mem_tail)
                { 
                    ejecutar();
                }
                else{
                    pc.printf("La memoria se encuentra vacia \n");
                } 
            break;
            case CM_GUARDAR: 
                if(guardar()==0)
                {
                    pc.printf("el programa se guardo correctamente \n");
                }
                else
                {
                    pc.printf("el programa no se pudo guardar... vuelva a intentar \n");
                }
            break;
            default: pc.printf("error de comando \n");break ;
            }
        }
        else
        {
            pc.printf("el comando End no fue definido... vuelva a intentar \n");
        }
    }
}
int mm2pulse(float vmm)
{
  if (vmm < MAXPOS)
    return int (vmm*(MAXPULSE-MINPULSE)/(MAXPOS)) +MINPULSE;
  return MAXPULSE; 
}
void SetZ(uint8_t _z)
{
    z=_z;
    int PULSEZ=mm2pulse(z);
    mypwmZ.pulsewidth_us(PULSEZ); 
}
void Vertex2D(uint8_t _x,uint8_t _y)
{
    x=_x;
    y=_y;
    int PULSEX=mm2pulse(x);
    int PULSEY=mm2pulse(y);
    mypwmX.pulsewidth_us(PULSEX);
    mypwmY.pulsewidth_us(PULSEY);   
}
void program_serial()
{
    pc.baud(9600);              
    pc.format(8,SerialBase::None,1);       
}
void ejecutar()
{
    program_serial();                                     
    pc.printf("el programa se esta ejecutando \n");
    uint8_t a=0,b=0,c=0,d=0; 
    uint32_t l,l1,l2,l3; 
    MEM_TYPE val; //
    
    mem_get(&val); 
    l1=(val&0xff00)>>8; 
    l2=(val&0xff0000)>>16; 
    l3=(val&0xff000000)>>24; 
    l=val&0xff; 
    while(c!=CM_END)
    {
        a=l3;
        pc.putc(a);
        b=l2;
        pc.putc(b);
        c=l1;
        pc.putc(c);
        d=l;
        pc.putc(d);
        if(a==CM_SERVO)
        {
            Vertex2D(b,c);           
        }
        else if(c==CM_SDRAW)
        {
            SetZ(DRAW);              
        }
        else if(c==CM_SN0DRAW)
        {
            SetZ(NODRAW);            
        }
        mem_get(&val);
        l1=(val&0xff00)>>8; 
        l2=(val&0xff0000)>>16;
        l3=(val&0xff000000)>>24;
        l=val&0xff;
        wait(1);
    }
    pc.printf("el programa se termino de ejecutar \n");
    mem_tail=0; 
}
int guardar()
{
    mem_free();
    uint32_t l=0; 
    uint8_t sl; 
    program_serial();
    pc.printf("ingrese sus comandos y coordenadas \n");
    sl=pc.getc();
    pc.putc(sl);
    while(sl!=CM_END)
    {
        switch(sl)
        {
            case CM_SERVO:
                l=l+sl<<8; 
                sl=pc.getc();
                l=l+sl;
                pc.putc(l);
                l=l<<8;
                sl=pc.getc();
                l=l+sl;
                pc.putc(l);
                l=l<<8;
                sl=pc.getc();
                if(sl!=CM_STOP) 
                {
                    pc.printf("comando End no definido \n");
                    return 1;
                }
                l=l+sl;
                pc.putc(l);
                mem_put(l); 
            break;
            case CM_SDRAW:
                l=l+sl<<8;
                sl=pc.getc();
                if(sl!=CM_STOP)
                {
                    pc.printf("comando End no definido \n");
                    return 1;
                }
                l=l+sl;
                mem_put(l);
            break;
            case CM_SN0DRAW:
                l=l+sl<<8;
                sl=pc.getc();
                if(sl!=CM_STOP)
                {
                    pc.printf("comando End no definido \n");
                    return 1;
                }
                l=l+sl;
                mem_put(l);
            break; 
        }
        l=0;
        sl=pc.getc();   
    }
    sl=pc.getc();
    pc.printf("el programa termino de guardar \n");
    mem_put(0xfaf0);
    return 0;
}