Entrega 3er corte - sistemas embebidos

Committer:
Bethory
Date:
Wed May 30 04:46:28 2018 +0000
Revision:
1:fcdb45ee95b9
Parent:
0:6ad07c9019fd
Entrega Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bethory 0:6ad07c9019fd 1 #include "mbed.h"
Bethory 0:6ad07c9019fd 2 #include "draw.h"
Bethory 0:6ad07c9019fd 3 #include "stepmotor.h"
Bethory 0:6ad07c9019fd 4 //#include<string>
Bethory 0:6ad07c9019fd 5
Bethory 0:6ad07c9019fd 6 #define CM_ENTER 0xF0
Bethory 0:6ad07c9019fd 7 #define CM_PLAY 0xF6
Bethory 0:6ad07c9019fd 8 #define CM_PAUSE 0xF7
Bethory 0:6ad07c9019fd 9 #define CM_GIRO 0xF8
Bethory 0:6ad07c9019fd 10 #define CM_TRASLADAR 0xF9
Bethory 0:6ad07c9019fd 11 #define CM_STOP 0xFA
Bethory 0:6ad07c9019fd 12 #define CM_NODRAW 0xFB
Bethory 0:6ad07c9019fd 13 #define CM_DRAW 0XFC
Bethory 0:6ad07c9019fd 14 #define CM_VERTEX2D 0xFD
Bethory 0:6ad07c9019fd 15 #define CM_GUARDAR 0xFE
Bethory 0:6ad07c9019fd 16 #define CM_EJECUTAR 0xFF
Bethory 0:6ad07c9019fd 17
Bethory 0:6ad07c9019fd 18 #define MEM_SIZE 100
Bethory 0:6ad07c9019fd 19 #define MEM_TYPE uint32_t //significa que de ahora en más donde diga MEM_TYPE será tipo uint32_t
Bethory 0:6ad07c9019fd 20 #define PASOSxCUADRANTE 1000 //4096
Bethory 0:6ad07c9019fd 21 uint8_t mem_head = 0;
Bethory 0:6ad07c9019fd 22 uint8_t mem_tail = 0;
Bethory 0:6ad07c9019fd 23 char temp;
Bethory 0:6ad07c9019fd 24 bool full = 0;
Bethory 0:6ad07c9019fd 25 int valor=1;
Bethory 0:6ad07c9019fd 26 uint32_t cuadrantes = 0;
Bethory 0:6ad07c9019fd 27 bool direccion = 0;
Bethory 0:6ad07c9019fd 28
Bethory 0:6ad07c9019fd 29 MEM_TYPE buffer[MEM_SIZE];
Bethory 0:6ad07c9019fd 30 stepmotor smotor1(D9, D10, D11, D12);
Bethory 0:6ad07c9019fd 31 stepmotor smotor2(D2, D6, D7, D8);
Bethory 0:6ad07c9019fd 32 Serial command(PC_10, PC_11, 9600);
Bethory 1:fcdb45ee95b9 33 Serial letrero(PC_12, PD_2, 9600);
Bethory 0:6ad07c9019fd 34
Bethory 0:6ad07c9019fd 35 Thread hilo1;
Bethory 0:6ad07c9019fd 36
Bethory 0:6ad07c9019fd 37 void giroIzq()
Bethory 0:6ad07c9019fd 38 {
Bethory 0:6ad07c9019fd 39 smotor1.step(1000, 1);
Bethory 0:6ad07c9019fd 40 }
Bethory 0:6ad07c9019fd 41
Bethory 0:6ad07c9019fd 42 void stepforward()
Bethory 0:6ad07c9019fd 43 {
Bethory 0:6ad07c9019fd 44 smotor1.step(cuadrantes * PASOSxCUADRANTE, !direccion);
Bethory 0:6ad07c9019fd 45 hilo1.join();
Bethory 0:6ad07c9019fd 46 }
Bethory 0:6ad07c9019fd 47
Bethory 0:6ad07c9019fd 48 int dec2hex(char data)
Bethory 0:6ad07c9019fd 49 {
Bethory 0:6ad07c9019fd 50 int dividendo = (int)data;
Bethory 0:6ad07c9019fd 51 int cociente = dividendo / 16;
Bethory 0:6ad07c9019fd 52 int residuo = dividendo % 16;
Bethory 0:6ad07c9019fd 53 dividendo = cociente * 10 + residuo;
Bethory 0:6ad07c9019fd 54 //cociente=dividendo/16;
Bethory 0:6ad07c9019fd 55 //residuo=dividendo%16;
Bethory 0:6ad07c9019fd 56 //letrero.printf("%X = %d\n",data,dividendo);
Bethory 0:6ad07c9019fd 57 return dividendo;
Bethory 0:6ad07c9019fd 58 }
Bethory 0:6ad07c9019fd 59
Bethory 0:6ad07c9019fd 60 void giroDer()
Bethory 0:6ad07c9019fd 61 {
Bethory 0:6ad07c9019fd 62 smotor1.step(1000, 0);
Bethory 0:6ad07c9019fd 63 }
Bethory 0:6ad07c9019fd 64
Bethory 0:6ad07c9019fd 65 void girar(uint8_t sentido)
Bethory 0:6ad07c9019fd 66 {
Bethory 0:6ad07c9019fd 67 letrero.printf(">>>> %d \n", sentido);
Bethory 0:6ad07c9019fd 68 uint32_t speed = 1500;
Bethory 0:6ad07c9019fd 69 smotor1.set_speed(speed);
Bethory 0:6ad07c9019fd 70 smotor2.set_speed(speed);
Bethory 0:6ad07c9019fd 71 if (sentido == 1)
Bethory 0:6ad07c9019fd 72 {
Bethory 0:6ad07c9019fd 73 letrero.printf("pa la derecha!!\n");
Bethory 0:6ad07c9019fd 74 hilo1.start(giroIzq);
Bethory 0:6ad07c9019fd 75 smotor2.step(1000, 1);
Bethory 0:6ad07c9019fd 76 }
Bethory 0:6ad07c9019fd 77 else
Bethory 0:6ad07c9019fd 78 {
Bethory 0:6ad07c9019fd 79 letrero.printf("pa la izquierda!\n");
Bethory 0:6ad07c9019fd 80 hilo1.start(giroDer);
Bethory 0:6ad07c9019fd 81 smotor2.step(1000, 0);
Bethory 0:6ad07c9019fd 82 }
Bethory 0:6ad07c9019fd 83 wait(2);
Bethory 0:6ad07c9019fd 84 }
Bethory 0:6ad07c9019fd 85
Bethory 0:6ad07c9019fd 86 void mem_free()
Bethory 0:6ad07c9019fd 87 { //Estaba como uint32_t no como void
Bethory 0:6ad07c9019fd 88 mem_head = 0;
Bethory 0:6ad07c9019fd 89 full = 0;
Bethory 0:6ad07c9019fd 90 }
Bethory 0:6ad07c9019fd 91
Bethory 0:6ad07c9019fd 92 bool mem_put(MEM_TYPE data)
Bethory 0:6ad07c9019fd 93 { //Escribir
Bethory 0:6ad07c9019fd 94 if (full)
Bethory 0:6ad07c9019fd 95 return 1;
Bethory 0:6ad07c9019fd 96 buffer[mem_head] = data; //carga en dato en el buffer
Bethory 0:6ad07c9019fd 97 mem_head += 1;
Bethory 0:6ad07c9019fd 98 if (mem_head == MEM_SIZE)
Bethory 0:6ad07c9019fd 99 full = 1;
Bethory 0:6ad07c9019fd 100 return 0;
Bethory 0:6ad07c9019fd 101 }
Bethory 0:6ad07c9019fd 102
Bethory 0:6ad07c9019fd 103 bool mem_get(MEM_TYPE *data)
Bethory 0:6ad07c9019fd 104 { //Leer
Bethory 0:6ad07c9019fd 105 if (mem_head == 0)
Bethory 0:6ad07c9019fd 106 return 1;
Bethory 0:6ad07c9019fd 107 if (mem_head == mem_tail)
Bethory 0:6ad07c9019fd 108 return 1;
Bethory 0:6ad07c9019fd 109 *data = buffer[mem_tail];
Bethory 0:6ad07c9019fd 110 mem_tail += 1;
Bethory 0:6ad07c9019fd 111 return 0;
Bethory 0:6ad07c9019fd 112 }
Bethory 0:6ad07c9019fd 113
Bethory 0:6ad07c9019fd 114 void Rx_interrupt()
Bethory 0:6ad07c9019fd 115 {
Bethory 0:6ad07c9019fd 116 char raw_data;
Bethory 0:6ad07c9019fd 117 raw_data = command.getc();
Bethory 0:6ad07c9019fd 118 letrero.printf(">>>>");
Bethory 0:6ad07c9019fd 119 switch (raw_data)
Bethory 0:6ad07c9019fd 120 {
Bethory 0:6ad07c9019fd 121 case CM_PAUSE:
Bethory 0:6ad07c9019fd 122 valor=0;
Bethory 0:6ad07c9019fd 123 break;
Bethory 0:6ad07c9019fd 124 case CM_PLAY:
Bethory 0:6ad07c9019fd 125 valor=1;
Bethory 0:6ad07c9019fd 126 break;
Bethory 0:6ad07c9019fd 127 default:
Bethory 0:6ad07c9019fd 128 break;
Bethory 0:6ad07c9019fd 129 }
Bethory 0:6ad07c9019fd 130 return;
Bethory 0:6ad07c9019fd 131 }
Bethory 0:6ad07c9019fd 132
Bethory 0:6ad07c9019fd 133 //quitar el for y poner un do,while
Bethory 0:6ad07c9019fd 134 //crear una variable global que sea la que le aumenta o no al j
Bethory 0:6ad07c9019fd 135 //así en la función de interrupción se cambia esa variable de 0 a 1 dependiendo si se quiere sumar o no
Bethory 0:6ad07c9019fd 136
Bethory 0:6ad07c9019fd 137 void ejecutar()
Bethory 0:6ad07c9019fd 138 {
Bethory 0:6ad07c9019fd 139 letrero.printf("inicio de ejecutar...\n");
Bethory 0:6ad07c9019fd 140 int j=0;
Bethory 0:6ad07c9019fd 141 do
Bethory 0:6ad07c9019fd 142 {
Bethory 0:6ad07c9019fd 143 letrero.attach(&Rx_interrupt, Serial::RxIrq);
Bethory 0:6ad07c9019fd 144 if (buffer[j] == CM_NODRAW)
Bethory 0:6ad07c9019fd 145 {
Bethory 0:6ad07c9019fd 146 nodraw();
Bethory 0:6ad07c9019fd 147 }
Bethory 0:6ad07c9019fd 148 if (buffer[j] == CM_DRAW)
Bethory 0:6ad07c9019fd 149 {
Bethory 0:6ad07c9019fd 150 draw();
Bethory 0:6ad07c9019fd 151 }
Bethory 0:6ad07c9019fd 152 if (buffer[j] == CM_STOP)
Bethory 0:6ad07c9019fd 153 {
Bethory 0:6ad07c9019fd 154 mem_free();
Bethory 0:6ad07c9019fd 155 return;
Bethory 0:6ad07c9019fd 156 }
Bethory 0:6ad07c9019fd 157 temp = buffer[j] >> 24 & 0xFF;
Bethory 0:6ad07c9019fd 158 if (temp == CM_VERTEX2D)
Bethory 0:6ad07c9019fd 159 {
Bethory 0:6ad07c9019fd 160 uint8_t datoX = buffer[j] >> 16 & 0xFF;
Bethory 0:6ad07c9019fd 161 uint8_t datoY = buffer[j] >> 8 & 0xFF;
Bethory 0:6ad07c9019fd 162 vertex2d(datoX, datoY);
Bethory 0:6ad07c9019fd 163 }
Bethory 0:6ad07c9019fd 164 if (temp == CM_TRASLADAR) //no mover si draw se encuentra activo
Bethory 0:6ad07c9019fd 165 {
Bethory 0:6ad07c9019fd 166 uint32_t speed = 1500;
Bethory 0:6ad07c9019fd 167 smotor1.set_speed(speed);
Bethory 0:6ad07c9019fd 168 smotor2.set_speed(speed);
Bethory 0:6ad07c9019fd 169 cuadrantes = buffer[j] >> 16 & 0xFF;
Bethory 0:6ad07c9019fd 170 direccion = buffer[j] >> 8 & 0xFF;
Bethory 0:6ad07c9019fd 171 hilo1.start(stepforward);
Bethory 0:6ad07c9019fd 172 smotor2.step(cuadrantes * PASOSxCUADRANTE, direccion);
Bethory 0:6ad07c9019fd 173 wait(1);
Bethory 0:6ad07c9019fd 174 }
Bethory 0:6ad07c9019fd 175 j+=valor;
Bethory 0:6ad07c9019fd 176 }while(j <= mem_head);
Bethory 0:6ad07c9019fd 177 letrero.printf("fin de ejecutar...\n");
Bethory 0:6ad07c9019fd 178 mem_free();
Bethory 0:6ad07c9019fd 179 }
Bethory 0:6ad07c9019fd 180
Bethory 0:6ad07c9019fd 181 void guardar()
Bethory 0:6ad07c9019fd 182 {
Bethory 0:6ad07c9019fd 183 letrero.printf("inicio de guardar...\n");
Bethory 0:6ad07c9019fd 184 MEM_TYPE val; //significa que la variable "val" es del tipo uint32_t
Bethory 0:6ad07c9019fd 185 char dato1, dato2;
Bethory 0:6ad07c9019fd 186 do
Bethory 0:6ad07c9019fd 187 {
Bethory 0:6ad07c9019fd 188 dato1 = command.getc();
Bethory 0:6ad07c9019fd 189 letrero.printf("%X\n",dato1);
Bethory 0:6ad07c9019fd 190 if (dato1 == CM_STOP)
Bethory 0:6ad07c9019fd 191 {
Bethory 0:6ad07c9019fd 192 dato2 = command.getc();
Bethory 0:6ad07c9019fd 193 if (dato2 == CM_ENTER)
Bethory 0:6ad07c9019fd 194 {
Bethory 0:6ad07c9019fd 195 val = dato1;
Bethory 0:6ad07c9019fd 196 mem_put(val);
Bethory 0:6ad07c9019fd 197 full = 1;
Bethory 0:6ad07c9019fd 198 }
Bethory 0:6ad07c9019fd 199 }
Bethory 0:6ad07c9019fd 200 if (dato1 == CM_NODRAW | dato1 == CM_DRAW)
Bethory 0:6ad07c9019fd 201 {
Bethory 0:6ad07c9019fd 202 dato2 = command.getc();
Bethory 0:6ad07c9019fd 203 if (dato2 == CM_ENTER)
Bethory 0:6ad07c9019fd 204 {
Bethory 0:6ad07c9019fd 205 val = dato1;
Bethory 0:6ad07c9019fd 206 mem_put(val);
Bethory 0:6ad07c9019fd 207 }
Bethory 0:6ad07c9019fd 208 }
Bethory 0:6ad07c9019fd 209 if (dato1 == CM_VERTEX2D)
Bethory 0:6ad07c9019fd 210 {
Bethory 0:6ad07c9019fd 211 dato2 = command.getc();
Bethory 0:6ad07c9019fd 212 if (dec2hex(dato2) <= 50)
Bethory 0:6ad07c9019fd 213 {
Bethory 0:6ad07c9019fd 214 val = CM_VERTEX2D;
Bethory 0:6ad07c9019fd 215 val = val << 8;
Bethory 0:6ad07c9019fd 216 val = val | dato2;
Bethory 0:6ad07c9019fd 217 dato2 = command.getc();
Bethory 0:6ad07c9019fd 218 if (dec2hex(dato2) <= 50)
Bethory 0:6ad07c9019fd 219 {
Bethory 0:6ad07c9019fd 220 val = val << 8;
Bethory 0:6ad07c9019fd 221 val = val | dato2;
Bethory 0:6ad07c9019fd 222 dato2 = command.getc();
Bethory 0:6ad07c9019fd 223 if (dato2 == CM_ENTER)
Bethory 0:6ad07c9019fd 224 {
Bethory 0:6ad07c9019fd 225 val = val << 8;
Bethory 0:6ad07c9019fd 226 val = val | CM_ENTER;
Bethory 0:6ad07c9019fd 227 mem_put(val);
Bethory 0:6ad07c9019fd 228 }
Bethory 0:6ad07c9019fd 229 }
Bethory 0:6ad07c9019fd 230 }
Bethory 0:6ad07c9019fd 231 }
Bethory 0:6ad07c9019fd 232 if (dato1 == CM_TRASLADAR)
Bethory 0:6ad07c9019fd 233 {
Bethory 0:6ad07c9019fd 234 dato2 = command.getc();
Bethory 0:6ad07c9019fd 235 if (dato2 <= 0xEF)
Bethory 0:6ad07c9019fd 236 {
Bethory 0:6ad07c9019fd 237 val = CM_TRASLADAR;
Bethory 0:6ad07c9019fd 238 val = val << 8;
Bethory 0:6ad07c9019fd 239 val = val | dato2;
Bethory 0:6ad07c9019fd 240 dato2 = command.getc();
Bethory 0:6ad07c9019fd 241 if (dato2 <= 1)
Bethory 0:6ad07c9019fd 242 {
Bethory 0:6ad07c9019fd 243 val = val << 8;
Bethory 0:6ad07c9019fd 244 val = val | dato2;
Bethory 0:6ad07c9019fd 245 dato2 = command.getc();
Bethory 0:6ad07c9019fd 246 if (dato2 == CM_ENTER)
Bethory 0:6ad07c9019fd 247 {
Bethory 0:6ad07c9019fd 248 val = val << 8;
Bethory 0:6ad07c9019fd 249 val = val | CM_ENTER;
Bethory 0:6ad07c9019fd 250 mem_put(val);
Bethory 0:6ad07c9019fd 251 }
Bethory 0:6ad07c9019fd 252 }
Bethory 0:6ad07c9019fd 253 }
Bethory 0:6ad07c9019fd 254 }
Bethory 0:6ad07c9019fd 255 } while (!full);
Bethory 0:6ad07c9019fd 256 letrero.printf("fin de guardar...\n");
Bethory 0:6ad07c9019fd 257 }
Bethory 0:6ad07c9019fd 258
Bethory 0:6ad07c9019fd 259 int main()
Bethory 0:6ad07c9019fd 260 {
Bethory 0:6ad07c9019fd 261 //command.baud(9600);
Bethory 0:6ad07c9019fd 262 init_servo();
Bethory 0:6ad07c9019fd 263 //home(); //llama a no_draw y va a 0,0
Bethory 0:6ad07c9019fd 264
Bethory 0:6ad07c9019fd 265 char read_cc;
Bethory 0:6ad07c9019fd 266 while (1)
Bethory 0:6ad07c9019fd 267 {
Bethory 0:6ad07c9019fd 268 read_cc = command.getc();
Bethory 0:6ad07c9019fd 269 switch (read_cc)
Bethory 0:6ad07c9019fd 270 {
Bethory 0:6ad07c9019fd 271 case CM_GUARDAR:
Bethory 0:6ad07c9019fd 272 if (read_cc = command.getc() == CM_ENTER)
Bethory 0:6ad07c9019fd 273 {
Bethory 0:6ad07c9019fd 274 guardar();
Bethory 0:6ad07c9019fd 275 }
Bethory 0:6ad07c9019fd 276 break; //FE
Bethory 0:6ad07c9019fd 277 case CM_EJECUTAR:
Bethory 0:6ad07c9019fd 278 if (read_cc = command.getc() == CM_ENTER)
Bethory 0:6ad07c9019fd 279 {
Bethory 0:6ad07c9019fd 280 ejecutar();
Bethory 0:6ad07c9019fd 281 }
Bethory 0:6ad07c9019fd 282 break; //FF
Bethory 0:6ad07c9019fd 283 case CM_GIRO:
Bethory 0:6ad07c9019fd 284 uint8_t sentido = command.getc();
Bethory 0:6ad07c9019fd 285 if (sentido <= 1)
Bethory 0:6ad07c9019fd 286 {
Bethory 0:6ad07c9019fd 287 read_cc = command.getc();
Bethory 0:6ad07c9019fd 288 if (read_cc = command.getc() == CM_ENTER)
Bethory 0:6ad07c9019fd 289 {
Bethory 0:6ad07c9019fd 290 girar(sentido);
Bethory 0:6ad07c9019fd 291 }
Bethory 0:6ad07c9019fd 292 }
Bethory 0:6ad07c9019fd 293 break; //F8
Bethory 0:6ad07c9019fd 294 default:
Bethory 0:6ad07c9019fd 295 letrero.printf("Paila \n");
Bethory 0:6ad07c9019fd 296 break;
Bethory 0:6ad07c9019fd 297 }
Bethory 0:6ad07c9019fd 298 }
Bethory 0:6ad07c9019fd 299 }
Bethory 0:6ad07c9019fd 300 /*
Bethory 0:6ad07c9019fd 301 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
Bethory 0:6ad07c9019fd 302 FE F0 FD 12 34 F0 FC F0 FD 10 10 F0 FD 40 10 F0 FD 40 40 F0 FD 10 40 F0 FB F0 F9 05 00 F0 FA F0 FF F0
Bethory 0:6ad07c9019fd 303 FE F0 FD 10 10 F0 FC F0 FD 40 10 F0 FD 40 40 F0 FD 10 40 F0 FD 10 10 F0 FB F0 FA F0 FF F0 //cuadrado
Bethory 0:6ad07c9019fd 304 FE F0 FD 10 10 F0 FC F0 FD 40 10 F0 FD 25 40 F0 FD 10 10 F0 FB F0 FA F0 FF F0 //triángulo
Bethory 0:6ad07c9019fd 305 FE F0 F9 02 00 F0 F9 02 01 F0 F9 01 01 F0 F9 01 00 F0 FA F0 FF F0 //prueba trasladar
Bethory 0:6ad07c9019fd 306 https://os.mbed.com/users/fabeltranm/
Bethory 0:6ad07c9019fd 307 */
Bethory 0:6ad07c9019fd 308 /*
Bethory 0:6ad07c9019fd 309 #include "mbed.h"
Bethory 0:6ad07c9019fd 310
Bethory 0:6ad07c9019fd 311 void print_char(char c = '*')
Bethory 0:6ad07c9019fd 312 {
Bethory 0:6ad07c9019fd 313 printf("%c", c);
Bethory 0:6ad07c9019fd 314 fflush(stdout);
Bethory 0:6ad07c9019fd 315 }
Bethory 0:6ad07c9019fd 316
Bethory 0:6ad07c9019fd 317 Thread thread;
Bethory 0:6ad07c9019fd 318
Bethory 0:6ad07c9019fd 319 DigitalOut led1(LED1);
Bethory 0:6ad07c9019fd 320
Bethory 0:6ad07c9019fd 321 void print_thread()
Bethory 0:6ad07c9019fd 322 {
Bethory 0:6ad07c9019fd 323 while (true) {
Bethory 0:6ad07c9019fd 324 wait(1);
Bethory 0:6ad07c9019fd 325 print_char();
Bethory 0:6ad07c9019fd 326 }
Bethory 0:6ad07c9019fd 327 }
Bethory 0:6ad07c9019fd 328
Bethory 0:6ad07c9019fd 329 int main()
Bethory 0:6ad07c9019fd 330 {
Bethory 0:6ad07c9019fd 331 printf("\n\n*** RTOS basic example ***\n");
Bethory 0:6ad07c9019fd 332
Bethory 0:6ad07c9019fd 333 thread.start(print_thread);
Bethory 0:6ad07c9019fd 334
Bethory 0:6ad07c9019fd 335 while (true) {
Bethory 0:6ad07c9019fd 336 led1 = !led1;
Bethory 0:6ad07c9019fd 337 wait(0.5);
Bethory 0:6ad07c9019fd 338 }
Bethory 0:6ad07c9019fd 339 }
Bethory 0:6ad07c9019fd 340 */