abrayan

Dependencies:   mbed

main.cpp

Committer:
fabeltranm
Date:
2018-03-17
Revision:
0:89b318e49395
Child:
1:526bdd5faa37

File content as of revision 0:89b318e49395:

#include "mbed.h"

#include "main.h"



/*
El sitema tiene tres estados:
1. Standby: estado que indica que esta en espera de un telecomando (Ejecutar 0 guardar)
2. Drawing: estado en donde el piccolo eejecuta las ordenes giardadas en el array 
            de memora hasta encontrar el comando CM_STOP 
3. Saving:  estado donde el sistema recibe lso datos y lso almacena en memoria acorde 
            a los comandos de 0xfd, oxfc, 0xfb,0cfa, se sake de este modo cuado se recibe
            el comando CM_STOP
            
todo telecomando debe finalizar con el dato CM_END
*/


Serial command(USBTX, USBRX);



int main() {
    init_servo();
    init_serial();
    draw();
    nodraw();
    home();
    debug_m("inicio \n");
    uint32_t read_cc;
    while(1)
    {
        read_cc=read_command();
        switch (read_cc) {
            case  CM_DRAWING: drawing(); break;
            case  CM_SAVING: saving(); break;
            default: debug_m("error de comando. \nSe espera  0xFEF0 o 0xFFF0 \n");break ;      
        }
    }
}



uint32_t read_command()
{
   // retorna los byte recibidos concatenados en un entero, se reciben maximo 4 bytes,
   // recibe hasta que encuetra  un fin de comando "CM_END".
   // Ejemplo: para el comando drawing se 
   // espera un byte,  por lo que al recibir 0xFF y 0xF0 la funcióm  retorna el 0xff
   // siempre y cuando se reciba el fin de dato  F0 de lo contrario retorna un cero
   // para el caso del comando vertex2d se espera  recibir 3 bytes, 1 del comando 
   // y dos bytes para x y y, se retorna la concatenación de los tres bytes  siempre y
   // cuando el cuarto byte sea CM_END de lo contrario retorna un cero 
   
    uint32_t val=0;
    uint8_t  cnt=0;
    
    char endc=command.getc();
    
    while(endc != CM_END && cnt <4) {
    if(endc!=CM_END)   
        val=((val<<8) +endc);
     endc=command.getc();
     cnt++;
    }   
    if(endc==CM_END)   
        return val;
    return 0;   //al retornar 0 indica que  no se recibe el comando  
}
void init_serial()
{
    command.baud(9600);    
}


void drawing(){
    // la funcion se ejecuta siemrpe y cuando exista datos validos para leer de 
    // memoria 
    debug_m("se esta ejecutando el dibujo... \n");       
     
    uint8_t error=0;
    MEM_TYPE dato;

    tail_reset();

    while(error==0){
        error = mem_get(&dato);
        if (error==0) {
            switch (dato) {
            case  CM_DRAW: 
                    debug_m("-> Baja Z\n");
                    draw();
                    break ;     
            case  CM_NODRAW: 
                    debug_m("-> Sube Z\n");
                    nodraw();
                    break ;     
            default: 
                int y      = (uint8_t)(dato);
                int x      = (uint8_t)(dato>>8);
                char ncomm  = (uint8_t)(dato>>16);
                
                if (ncomm == CM_VERTEX2D) {
                    debug_m("-> Mover piccolo x a %d y y a %d \n",x,x, y);
                    vertex2d(x,y);
                }else
                    debug_m("-> ERROR DE COMMANDO: %d %d %d \n " ,ncomm,x,y,y);
                break;   
             }
         }        
    }  
    
    debug_m("fin del comando dibujar..\n");    
    
}


void saving(){
    debug_m("se inicia el comado guardar..\n");    
    
    MEM_TYPE dato=0;
    mem_free();
    while(dato !=CM_STOP){
        dato = read_command();
        if (dato !=CM_STOP)
               mem_put(dato);
    }  
    debug_m("fin del comado guardar..\n");    
    
}

void debug_m(char *s , ... ){
    #if DEBUG
    command.printf(s);
    #endif  
}