Acercamiento a lo que pide el profe

Dependencies:   mbed

Fork of 01-01EjercicioFuncionXY by ferney alberto beltran molina

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers 01_main.cpp Source File

01_main.cpp

00001 #include "mbed.h"
00002 #include "draw.h"
00003 #include "stepmotor.h"
00004 
00005 #define CM_EJECUTAR 0xFF
00006 #define CM_GUARDAR 0xFE
00007 #define CM_TRASLADAR 0xF9
00008 #define CM_VERTEX2D 0xFD
00009 #define CM_DRAW 0XFC
00010 #define CM_NODRAW 0xFB
00011 #define CM_STOP 0xFA
00012 #define CM_ENTER 0xF0
00013 #define CM_GIRO 0xF8
00014 
00015 #define MEM_SIZE 100
00016 #define MEM_TYPE uint32_t //significa que de ahora en más donde diga MEM_TYPE será tipo uint32_t
00017 #define PASOSxCUADRANTE 250 //4096
00018 uint8_t mem_head = 0;
00019 uint8_t mem_tail = 0;
00020 char temp;
00021 bool full = 0;
00022 
00023 MEM_TYPE buffer[MEM_SIZE];
00024 stepmotor smotor1(D9,D10,D11,D12);
00025 stepmotor smotor2(D2,D6,D7,D8);
00026 Serial command(USBTX, USBRX);
00027 
00028 void girar(uint8_t sentido)
00029 {
00030     command.printf(">>>> %d \n",sentido);
00031     uint32_t speed = 1500;
00032     smotor1.set_speed(speed);
00033     smotor2.set_speed(speed);
00034     if(sentido==1)
00035     {
00036         command.printf("pa la derecha!!\n");
00037         smotor1.step(7* PASOSxCUADRANTE, 0);
00038         smotor2.step(7 * PASOSxCUADRANTE, 1);
00039         
00040     }else
00041     {
00042         command.printf("pa la izquierda!\n");
00043         smotor1.step(7 * PASOSxCUADRANTE, 1);
00044         smotor2.step(7 * PASOSxCUADRANTE, 0);   
00045     }
00046     wait(2);
00047 }
00048 
00049 void mem_free()
00050 { //Estaba como uint32_t no como void
00051     mem_head = 0; 
00052     full = 0;
00053 }
00054 
00055 bool mem_put(MEM_TYPE data)
00056 { //Escribir
00057     if (full)
00058         return 1;
00059     buffer[mem_head] = data; //carga en dato en el buffer
00060     mem_head += 1;
00061     if (mem_head == MEM_SIZE)
00062         full = 1;
00063     return 0;
00064 }
00065 
00066 bool mem_get(MEM_TYPE *data)
00067 { //Leer
00068     if (mem_head == 0)
00069         return 1;
00070     if (mem_head == mem_tail)
00071         return 1;
00072     *data = buffer[mem_tail];
00073     mem_tail += 1;
00074     return 0;
00075 }
00076 
00077 void ejecutar()
00078 {
00079     command.printf("inicio de ejecutar...\n");
00080     for (int j = 0; j <= mem_head - 1; j++)
00081     {
00082         command.printf("%x\n", buffer[j]);
00083         if (buffer[j] == CM_NODRAW)
00084         {
00085             nodraw();
00086         }
00087         if (buffer[j] == CM_DRAW)
00088         {
00089             draw();
00090         }
00091         if (buffer[j] == CM_STOP)
00092         {
00093             mem_free();
00094             return;
00095         }
00096         temp = buffer[j] >> 24 & 0xFF;
00097         if (temp == CM_VERTEX2D)
00098         {
00099             uint8_t datoX = buffer[j] >> 16 & 0xFF;
00100             uint8_t datoY = buffer[j] >> 8 & 0xFF;
00101             vertex2d(datoX, datoY);
00102             //wait(1);
00103         }
00104         if (temp == CM_TRASLADAR) //no mover si draw se encuentra activo
00105         {
00106             uint32_t speed = 1500;
00107             smotor1.set_speed(speed);
00108             smotor2.set_speed(speed);
00109             uint32_t cuadrantes = buffer[j] >> 16 & 0xFF;
00110             bool direccion = buffer[j] >> 8 & 0xFF;
00111             smotor1.step(cuadrantes * PASOSxCUADRANTE, direccion);
00112             smotor2.step(cuadrantes * PASOSxCUADRANTE, direccion);
00113             wait(2);
00114         }
00115     }
00116     command.printf("fin de ejecutar...\n");
00117     mem_free();
00118 }
00119 
00120 void guardar()
00121 {
00122     command.printf("inicio de guardar...\n");
00123     MEM_TYPE val; //significa que la variable "val" es del tipo uint32_t
00124     char dato1, dato2;
00125     do
00126     {
00127         dato1 = command.getc();
00128         if (dato1 == CM_STOP)
00129         {
00130             dato2 = command.getc();
00131             if (dato2 == CM_ENTER)
00132             {
00133                 val = dato1;
00134                 mem_put(val);
00135                 return;
00136             }
00137         }
00138         if (dato1 == CM_NODRAW | dato1 == CM_DRAW)
00139         {
00140             dato2 = command.getc();
00141             if (dato2 == CM_ENTER)
00142             {
00143                 val = dato1;
00144                 mem_put(val);
00145             }
00146         }
00147         if (dato1 == CM_VERTEX2D)
00148         {
00149             dato2 = command.getc();
00150             if (dato2 <= 0x32)
00151             {
00152                 val = CM_VERTEX2D;
00153                 val = val << 8;
00154                 val = val | dato2;
00155                 dato2 = command.getc();
00156                 if (dato2 <= 0x32)
00157                 {
00158                     val = val << 8;
00159                     val = val | dato2;
00160                     dato2 = command.getc();
00161                     if (dato2 == CM_ENTER)
00162                     {
00163                         val = val << 8;
00164                         val = val | CM_ENTER;
00165                         mem_put(val);
00166                     }
00167                 }
00168             }
00169         }
00170         if (dato1 == CM_TRASLADAR)
00171         {
00172             dato2 = command.getc();
00173             if (dato2 <= 0xEF)
00174             {
00175                 val = CM_TRASLADAR;
00176                 val = val << 8;
00177                 val = val | dato2;
00178                 dato2 = command.getc();
00179                 if (dato2 <= 1)
00180                 {
00181                     val = val << 8;
00182                     val = val | dato2;
00183                     dato2 = command.getc();
00184                     if (dato2 == CM_ENTER)
00185                     {
00186                         val = val << 8;
00187                         val = val | CM_ENTER;
00188                         mem_put(val);
00189                     }
00190                 }
00191             }
00192         }
00193     } while (!full);
00194     command.printf("fin de guardar...\n");
00195 }
00196 
00197 int main()
00198 {
00199     command.baud(9600);
00200     init_servo();
00201     //home(); //llama a no_draw y va a 0,0
00202 
00203     char read_cc;
00204     while (1)
00205     {
00206         read_cc = command.getc();
00207         switch (read_cc)
00208         {
00209         case CM_GUARDAR:
00210             if (read_cc = command.getc() == CM_ENTER)
00211             {
00212                 guardar();
00213             }
00214             break; //FE
00215         case CM_EJECUTAR:
00216             if (read_cc = command.getc() == CM_ENTER)
00217             {
00218                 ejecutar();
00219             }
00220             break; //FF
00221         case CM_GIRO:
00222             uint8_t sentido = command.getc();
00223             if (sentido <= 1)
00224             {
00225                 read_cc = command.getc();
00226                 if (read_cc = command.getc() == CM_ENTER)
00227                 {
00228                     girar(sentido);
00229             } 
00230             }   
00231             break; //F8
00232         default:
00233             command.printf("Paila \n");
00234             break;
00235         }
00236     }
00237 }
00238 /*
00239 FE F0 FD 12 34 F0 FB F0 FD 0A 0A F0 FD 28 0A F0 FD 28 28 F0 FD 0A 28 F0 F9 27 00 F0 FC F0 FA F0 FF F0
00240 FE F0 F9 02 00 F0 F9 02 01 F0 F9 01 01 F0 F9 01 00 F0 FA F0 FF F0
00241     https://os.mbed.com/users/fabeltranm/
00242 */