slave
Dependencies: mbedtls-slave-prot-prod
Dependents: _Prototipo_Produccion _Prototipo_Produccion
Slave.cpp@2:1141f1fb0761, 2019-07-22 (annotated)
- Committer:
- pabloandres2906
- Date:
- Mon Jul 22 22:02:09 2019 +0000
- Revision:
- 2:1141f1fb0761
- Parent:
- 0:424cd8b7203c
Programa Slave
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
williequesada | 0:424cd8b7203c | 1 | #include "Slave.h" |
williequesada | 0:424cd8b7203c | 2 | #include "mbed.h" |
williequesada | 0:424cd8b7203c | 3 | #include "stdio.h" |
williequesada | 0:424cd8b7203c | 4 | #include <string> |
williequesada | 0:424cd8b7203c | 5 | |
williequesada | 0:424cd8b7203c | 6 | #include "mbedtls/rsa.h" |
williequesada | 0:424cd8b7203c | 7 | #include "mbedtls/pk.h" |
williequesada | 0:424cd8b7203c | 8 | #include "mbedtls/base64.h" |
williequesada | 0:424cd8b7203c | 9 | #include "mbedtls/ctr_drbg.h" |
williequesada | 0:424cd8b7203c | 10 | #include "mbedtls/error.h" |
williequesada | 0:424cd8b7203c | 11 | #include "mbedtls/ctr_drbg.h" |
williequesada | 0:424cd8b7203c | 12 | #include "mbedtls/platform.h" |
williequesada | 0:424cd8b7203c | 13 | #include "mbedtls/entropy.h" |
williequesada | 0:424cd8b7203c | 14 | |
williequesada | 0:424cd8b7203c | 15 | #define NEXT_STEP 0x85 |
williequesada | 0:424cd8b7203c | 16 | #define NEXT_SLEEP 0x86 |
williequesada | 0:424cd8b7203c | 17 | #define NO_DATA 0x87 |
williequesada | 0:424cd8b7203c | 18 | |
williequesada | 0:424cd8b7203c | 19 | static const uint8_t PublicKeyTXT[] = |
williequesada | 0:424cd8b7203c | 20 | "-----BEGIN PUBLIC KEY-----\n" |
williequesada | 0:424cd8b7203c | 21 | "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtlciI/Mk4fkxeOwiB0iwiBmoS\n" |
williequesada | 0:424cd8b7203c | 22 | "yhqQNKBg+KmzpZDcLkl8ShDY/BjZjW9UXYX8ptCHwV9WU4ltdA4fBTm51m52fOGv\n" |
williequesada | 0:424cd8b7203c | 23 | "ZPODurIbNEnaFMRn9hsDJRA6adz32XRQVsjQYLMnQnlaMYGKvuatHPPK/ZCuJRmd\n" |
williequesada | 0:424cd8b7203c | 24 | "ttiijs3t/bmCU/Vi8wIDAQAB\n" |
williequesada | 0:424cd8b7203c | 25 | "-----END PUBLIC KEY-----\n"; |
williequesada | 0:424cd8b7203c | 26 | |
williequesada | 0:424cd8b7203c | 27 | char Slave_Buffer[255]; |
williequesada | 0:424cd8b7203c | 28 | int Slave_Counter=0; |
williequesada | 0:424cd8b7203c | 29 | |
williequesada | 0:424cd8b7203c | 30 | uint8_t MessageDecrypt[] ="{\"municipio\":\"San Jose\",\"id\":\"1067\",\"place\":\"AAAA\",\"time\":\"000\",\"t2\":\"%5303105315252296=21080000000000000000?\"}"; |
williequesada | 0:424cd8b7203c | 31 | uint8_t Encryption[200]; |
williequesada | 0:424cd8b7203c | 32 | uint8_t Encryption1[200]; |
williequesada | 0:424cd8b7203c | 33 | size_t *Olen2; |
williequesada | 0:424cd8b7203c | 34 | |
williequesada | 0:424cd8b7203c | 35 | SLAVE::SLAVE(PinName TX, PinName RX,PinName AWAKE):Uart(TX,RX),_AWAKE(AWAKE) |
williequesada | 0:424cd8b7203c | 36 | { |
williequesada | 0:424cd8b7203c | 37 | _AWAKE=0; |
williequesada | 0:424cd8b7203c | 38 | Uart.attach(this,&SLAVE::UartInterruption); |
williequesada | 0:424cd8b7203c | 39 | } |
williequesada | 0:424cd8b7203c | 40 | |
williequesada | 0:424cd8b7203c | 41 | bool SLAVE::Available() |
williequesada | 0:424cd8b7203c | 42 | { |
williequesada | 0:424cd8b7203c | 43 | if(Slave_Counter>0) { |
williequesada | 0:424cd8b7203c | 44 | return 1; |
williequesada | 0:424cd8b7203c | 45 | } else { |
williequesada | 0:424cd8b7203c | 46 | return 0; |
williequesada | 0:424cd8b7203c | 47 | } |
williequesada | 0:424cd8b7203c | 48 | } |
williequesada | 0:424cd8b7203c | 49 | |
williequesada | 0:424cd8b7203c | 50 | bool SLAVE::Message() |
williequesada | 0:424cd8b7203c | 51 | { |
williequesada | 0:424cd8b7203c | 52 | if(Slave_Counter>4) { |
williequesada | 0:424cd8b7203c | 53 | return 1; |
williequesada | 0:424cd8b7203c | 54 | } else { |
williequesada | 0:424cd8b7203c | 55 | return 0; |
williequesada | 0:424cd8b7203c | 56 | } |
williequesada | 0:424cd8b7203c | 57 | } |
williequesada | 0:424cd8b7203c | 58 | |
williequesada | 0:424cd8b7203c | 59 | void SLAVE::Command(uint8_t _Command) |
williequesada | 0:424cd8b7203c | 60 | { |
williequesada | 0:424cd8b7203c | 61 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 62 | Uart.putc(_Command); |
williequesada | 0:424cd8b7203c | 63 | } else { |
williequesada | 0:424cd8b7203c | 64 | wait_ms(500); |
williequesada | 0:424cd8b7203c | 65 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 66 | Uart.putc(_Command); |
williequesada | 0:424cd8b7203c | 67 | } |
williequesada | 0:424cd8b7203c | 68 | } |
williequesada | 0:424cd8b7203c | 69 | } |
williequesada | 0:424cd8b7203c | 70 | |
williequesada | 0:424cd8b7203c | 71 | void SLAVE::Send_Hosting(char Parquimetro[],char Municipio[],char Estado[]) |
williequesada | 0:424cd8b7203c | 72 | { |
williequesada | 0:424cd8b7203c | 73 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 74 | Uart.printf("%s",Municipio); |
williequesada | 0:424cd8b7203c | 75 | Uart.printf("%s",Estado); |
williequesada | 0:424cd8b7203c | 76 | Uart.printf("%s",Parquimetro); |
williequesada | 0:424cd8b7203c | 77 | } else { |
williequesada | 0:424cd8b7203c | 78 | wait_ms(500); |
williequesada | 0:424cd8b7203c | 79 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 80 | Uart.printf("%s",Municipio); |
williequesada | 0:424cd8b7203c | 81 | Uart.printf("%s",Estado); |
williequesada | 0:424cd8b7203c | 82 | Uart.printf("%s",Parquimetro); |
williequesada | 0:424cd8b7203c | 83 | } |
williequesada | 0:424cd8b7203c | 84 | } |
williequesada | 0:424cd8b7203c | 85 | } |
williequesada | 0:424cd8b7203c | 86 | |
williequesada | 0:424cd8b7203c | 87 | void SLAVE::Encryption_Send() |
williequesada | 0:424cd8b7203c | 88 | { |
williequesada | 0:424cd8b7203c | 89 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 90 | for(int i=0;i<172;i++){ |
williequesada | 0:424cd8b7203c | 91 | Uart.putc(Encryption1[i]); |
williequesada | 0:424cd8b7203c | 92 | |
williequesada | 0:424cd8b7203c | 93 | } |
williequesada | 0:424cd8b7203c | 94 | } else { |
williequesada | 0:424cd8b7203c | 95 | wait_ms(500); |
williequesada | 0:424cd8b7203c | 96 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 97 | for(int i=0;i<172;i++){ |
williequesada | 0:424cd8b7203c | 98 | Uart.putc(Encryption1[i]); |
williequesada | 0:424cd8b7203c | 99 | } |
williequesada | 0:424cd8b7203c | 100 | } |
williequesada | 0:424cd8b7203c | 101 | } |
williequesada | 0:424cd8b7203c | 102 | } |
williequesada | 0:424cd8b7203c | 103 | |
williequesada | 0:424cd8b7203c | 104 | void SLAVE::Encryption_Print() |
williequesada | 0:424cd8b7203c | 105 | { |
williequesada | 0:424cd8b7203c | 106 | for(int i=0;i<172;i++){ |
williequesada | 0:424cd8b7203c | 107 | printf("%c",Encryption1[i]); |
williequesada | 0:424cd8b7203c | 108 | } |
williequesada | 0:424cd8b7203c | 109 | printf("\n"); |
williequesada | 0:424cd8b7203c | 110 | } |
williequesada | 0:424cd8b7203c | 111 | |
williequesada | 0:424cd8b7203c | 112 | void SLAVE::Set_Time(int Time){ |
williequesada | 0:424cd8b7203c | 113 | char TimeString[4]; |
williequesada | 0:424cd8b7203c | 114 | if(Time<100) { |
williequesada | 0:424cd8b7203c | 115 | sprintf(TimeString,"0%i",Time); |
williequesada | 0:424cd8b7203c | 116 | } else { |
williequesada | 0:424cd8b7203c | 117 | sprintf(TimeString,"%i",Time); |
williequesada | 0:424cd8b7203c | 118 | } |
williequesada | 0:424cd8b7203c | 119 | MessageDecrypt[59]=TimeString[0]; |
williequesada | 0:424cd8b7203c | 120 | MessageDecrypt[60]=TimeString[1]; |
williequesada | 0:424cd8b7203c | 121 | MessageDecrypt[61]=TimeString[2]; |
williequesada | 0:424cd8b7203c | 122 | } |
williequesada | 0:424cd8b7203c | 123 | |
williequesada | 0:424cd8b7203c | 124 | void SLAVE::Set_Place(char Place[]){ |
williequesada | 0:424cd8b7203c | 125 | MessageDecrypt[45]=Place[0]; |
williequesada | 0:424cd8b7203c | 126 | MessageDecrypt[46]=Place[1]; |
williequesada | 0:424cd8b7203c | 127 | MessageDecrypt[47]=Place[2]; |
williequesada | 0:424cd8b7203c | 128 | MessageDecrypt[48]=Place[3]; |
williequesada | 0:424cd8b7203c | 129 | } |
williequesada | 0:424cd8b7203c | 130 | |
williequesada | 0:424cd8b7203c | 131 | void SLAVE::Set_Track(char Track2[]){ |
williequesada | 0:424cd8b7203c | 132 | for(int i=0; i<37; i++) { |
williequesada | 0:424cd8b7203c | 133 | MessageDecrypt[71+i]=Track2[i]; |
williequesada | 0:424cd8b7203c | 134 | } |
williequesada | 0:424cd8b7203c | 135 | } |
williequesada | 0:424cd8b7203c | 136 | |
williequesada | 0:424cd8b7203c | 137 | void SLAVE::Encryption_Data(char Parquimetro[],char Municipio[],int Tiempo,char Espacio[],char Track2[]){ |
williequesada | 0:424cd8b7203c | 138 | // Municipio |
williequesada | 0:424cd8b7203c | 139 | MessageDecrypt[14]=Municipio[0]; |
williequesada | 0:424cd8b7203c | 140 | MessageDecrypt[15]=Municipio[1]; |
williequesada | 0:424cd8b7203c | 141 | MessageDecrypt[16]=Municipio[2]; |
williequesada | 0:424cd8b7203c | 142 | MessageDecrypt[17]=Municipio[3]; |
williequesada | 0:424cd8b7203c | 143 | MessageDecrypt[18]=Municipio[4]; |
williequesada | 0:424cd8b7203c | 144 | MessageDecrypt[19]=Municipio[5]; |
williequesada | 0:424cd8b7203c | 145 | MessageDecrypt[20]=Municipio[6]; |
williequesada | 0:424cd8b7203c | 146 | MessageDecrypt[21]=Municipio[7]; |
williequesada | 0:424cd8b7203c | 147 | // Identificador |
williequesada | 0:424cd8b7203c | 148 | MessageDecrypt[30]=Parquimetro[0]; |
williequesada | 0:424cd8b7203c | 149 | MessageDecrypt[31]=Parquimetro[1]; |
williequesada | 0:424cd8b7203c | 150 | MessageDecrypt[32]=Parquimetro[2]; |
williequesada | 0:424cd8b7203c | 151 | MessageDecrypt[33]=Parquimetro[3]; |
williequesada | 0:424cd8b7203c | 152 | // Espacio |
williequesada | 0:424cd8b7203c | 153 | MessageDecrypt[45]=Espacio[0]; |
williequesada | 0:424cd8b7203c | 154 | MessageDecrypt[46]=Espacio[1]; |
williequesada | 0:424cd8b7203c | 155 | MessageDecrypt[47]=Espacio[2]; |
williequesada | 0:424cd8b7203c | 156 | MessageDecrypt[48]=Espacio[3]; |
williequesada | 0:424cd8b7203c | 157 | // Tiempo |
williequesada | 0:424cd8b7203c | 158 | char TiempoString[4]; |
williequesada | 0:424cd8b7203c | 159 | if(Tiempo<100) { |
williequesada | 0:424cd8b7203c | 160 | sprintf(TiempoString,"0%i",Tiempo); |
williequesada | 0:424cd8b7203c | 161 | } else { |
williequesada | 0:424cd8b7203c | 162 | sprintf(TiempoString,"%i",Tiempo); |
williequesada | 0:424cd8b7203c | 163 | } |
williequesada | 0:424cd8b7203c | 164 | MessageDecrypt[59]=TiempoString[0]; |
williequesada | 0:424cd8b7203c | 165 | MessageDecrypt[60]=TiempoString[1]; |
williequesada | 0:424cd8b7203c | 166 | MessageDecrypt[61]=TiempoString[2]; |
williequesada | 0:424cd8b7203c | 167 | // Track2 |
williequesada | 0:424cd8b7203c | 168 | for(int i=0; i<37; i++) { |
williequesada | 0:424cd8b7203c | 169 | MessageDecrypt[71+i]=Track2[i]; |
williequesada | 0:424cd8b7203c | 170 | } |
williequesada | 0:424cd8b7203c | 171 | } |
williequesada | 0:424cd8b7203c | 172 | |
williequesada | 0:424cd8b7203c | 173 | void SLAVE::Encryption_Execute(){ |
williequesada | 0:424cd8b7203c | 174 | |
williequesada | 0:424cd8b7203c | 175 | mbedtls_entropy_context entropy; |
williequesada | 0:424cd8b7203c | 176 | mbedtls_entropy_init( &entropy ); |
williequesada | 0:424cd8b7203c | 177 | |
williequesada | 0:424cd8b7203c | 178 | mbedtls_ctr_drbg_context ctr_drbg; |
williequesada | 0:424cd8b7203c | 179 | mbedtls_ctr_drbg_init(&ctr_drbg); |
williequesada | 0:424cd8b7203c | 180 | |
williequesada | 0:424cd8b7203c | 181 | mbedtls_pk_context PublicKey; // Crea la llave |
williequesada | 0:424cd8b7203c | 182 | mbedtls_pk_init(&PublicKey); // Inicializa la llave |
williequesada | 0:424cd8b7203c | 183 | |
williequesada | 0:424cd8b7203c | 184 | int ret; |
williequesada | 0:424cd8b7203c | 185 | size_t olen = 0; |
williequesada | 0:424cd8b7203c | 186 | uint8_t error[100]; |
williequesada | 0:424cd8b7203c | 187 | size_t errorlen=100; |
williequesada | 0:424cd8b7203c | 188 | const char *pers = "mbedtls_pk_encrypt"; |
williequesada | 0:424cd8b7203c | 189 | |
williequesada | 0:424cd8b7203c | 190 | // Se inicia el generador de entropia del MCU para obtner numeros aleatorios |
williequesada | 0:424cd8b7203c | 191 | |
williequesada | 0:424cd8b7203c | 192 | if( ( ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char*)pers, strlen(pers))) != 0) |
williequesada | 0:424cd8b7203c | 193 | { |
williequesada | 0:424cd8b7203c | 194 | mbedtls_strerror(ret,(char*)error,errorlen); |
williequesada | 0:424cd8b7203c | 195 | } else { |
williequesada | 0:424cd8b7203c | 196 | printf( "Entropy generator ok\n"); |
williequesada | 0:424cd8b7203c | 197 | } |
williequesada | 0:424cd8b7203c | 198 | |
williequesada | 0:424cd8b7203c | 199 | // Iniciar la llave almacenada en al variable PublucKey para la encriptacion |
williequesada | 0:424cd8b7203c | 200 | |
williequesada | 0:424cd8b7203c | 201 | if ((ret=mbedtls_pk_parse_public_key(&PublicKey, PublicKeyTXT, sizeof(PublicKeyTXT))) != 0) |
williequesada | 0:424cd8b7203c | 202 | { |
williequesada | 0:424cd8b7203c | 203 | printf( "Public key fail\n"); |
williequesada | 0:424cd8b7203c | 204 | printf(" Ret: 0x%04x\n",ret); |
williequesada | 0:424cd8b7203c | 205 | mbedtls_strerror(ret,(char*)error,errorlen); |
williequesada | 0:424cd8b7203c | 206 | printf( "Error: %s\n",error); |
williequesada | 0:424cd8b7203c | 207 | } else { |
williequesada | 0:424cd8b7203c | 208 | //printf( "Public key ok "); |
williequesada | 0:424cd8b7203c | 209 | //SizeOutputKey=mbedtls_pk_get_len(&PublicKey); |
williequesada | 0:424cd8b7203c | 210 | //printf("--> %i\n\n",SizeOutputKey); |
williequesada | 0:424cd8b7203c | 211 | } |
williequesada | 0:424cd8b7203c | 212 | |
williequesada | 0:424cd8b7203c | 213 | // Proceso de encriptacion donde se utilizan tanto el generador random como la key inicializadas |
williequesada | 0:424cd8b7203c | 214 | |
williequesada | 0:424cd8b7203c | 215 | if ((ret=mbedtls_pk_encrypt(&PublicKey, MessageDecrypt, sizeof(MessageDecrypt)-1,Encryption, &olen, 200 ,mbedtls_ctr_drbg_random, &ctr_drbg)) != 0) |
williequesada | 0:424cd8b7203c | 216 | { |
williequesada | 0:424cd8b7203c | 217 | printf("Encrypt failed\n"); |
williequesada | 0:424cd8b7203c | 218 | printf("Ret: 0x%04x, Olen: %i,\n",ret,olen); |
williequesada | 0:424cd8b7203c | 219 | mbedtls_strerror(ret,(char*)error,errorlen); |
williequesada | 0:424cd8b7203c | 220 | printf( "Error: %s\n",error); |
williequesada | 0:424cd8b7203c | 221 | } |
williequesada | 0:424cd8b7203c | 222 | else |
williequesada | 0:424cd8b7203c | 223 | { |
williequesada | 0:424cd8b7203c | 224 | //printf(" Encrypt ok\n"); |
williequesada | 0:424cd8b7203c | 225 | //printf(" Ret: 0x%04x, Olen: %i,\n\n",ret,olen); |
williequesada | 0:424cd8b7203c | 226 | } |
williequesada | 0:424cd8b7203c | 227 | |
williequesada | 0:424cd8b7203c | 228 | // Se convierte el resultado de la encriptacion a base 64 para eliminar caracteres invalidos |
williequesada | 0:424cd8b7203c | 229 | |
williequesada | 0:424cd8b7203c | 230 | mbedtls_base64_encode(Encryption1,200,Olen2,Encryption,128); |
williequesada | 0:424cd8b7203c | 231 | //printf( "Mensaje encriptado: %s\n",Encryption1); |
williequesada | 0:424cd8b7203c | 232 | //printf( "Longitud encriptado: %i\n",Olen2); |
williequesada | 0:424cd8b7203c | 233 | printf( "Mensaje Original: %s\n", MessageDecrypt); |
williequesada | 0:424cd8b7203c | 234 | |
williequesada | 0:424cd8b7203c | 235 | mbedtls_pk_free(&PublicKey); // Libera las variables usadas en el proceso |
williequesada | 0:424cd8b7203c | 236 | mbedtls_ctr_drbg_free(&ctr_drbg ); |
williequesada | 0:424cd8b7203c | 237 | mbedtls_entropy_free(&entropy ); |
williequesada | 0:424cd8b7203c | 238 | |
williequesada | 0:424cd8b7203c | 239 | } |
williequesada | 0:424cd8b7203c | 240 | |
williequesada | 0:424cd8b7203c | 241 | void SLAVE::Send_User(char Parquimetro[],char Municipio[],int Tiempo,char Espacio[],char Track2[]) |
williequesada | 0:424cd8b7203c | 242 | { |
williequesada | 0:424cd8b7203c | 243 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 244 | Uart.printf("%s",Municipio); |
williequesada | 0:424cd8b7203c | 245 | Uart.printf("%s",Espacio); |
williequesada | 0:424cd8b7203c | 246 | Uart.printf("%s",Parquimetro); |
williequesada | 0:424cd8b7203c | 247 | if(Tiempo<100) { |
williequesada | 0:424cd8b7203c | 248 | Uart.putc('0'); |
williequesada | 0:424cd8b7203c | 249 | Uart.printf("%i",Tiempo); |
williequesada | 0:424cd8b7203c | 250 | } else { |
williequesada | 0:424cd8b7203c | 251 | Uart.printf("%i",Tiempo); |
williequesada | 0:424cd8b7203c | 252 | } |
williequesada | 0:424cd8b7203c | 253 | Uart.printf("%s",Track2); |
williequesada | 0:424cd8b7203c | 254 | } else { |
williequesada | 0:424cd8b7203c | 255 | wait_ms(500); |
williequesada | 0:424cd8b7203c | 256 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 257 | Uart.printf("%s",Municipio); |
williequesada | 0:424cd8b7203c | 258 | Uart.printf("%s",Espacio); |
williequesada | 0:424cd8b7203c | 259 | Uart.printf("%s",Parquimetro); |
williequesada | 0:424cd8b7203c | 260 | if(Tiempo<100) { |
williequesada | 0:424cd8b7203c | 261 | Uart.putc('0'); |
williequesada | 0:424cd8b7203c | 262 | Uart.printf("%i",Tiempo); |
williequesada | 0:424cd8b7203c | 263 | } else { |
williequesada | 0:424cd8b7203c | 264 | Uart.printf("%i",Tiempo); |
williequesada | 0:424cd8b7203c | 265 | } |
williequesada | 0:424cd8b7203c | 266 | Uart.printf("%s",Track2); |
williequesada | 0:424cd8b7203c | 267 | } |
williequesada | 0:424cd8b7203c | 268 | } |
williequesada | 0:424cd8b7203c | 269 | } |
williequesada | 0:424cd8b7203c | 270 | |
williequesada | 0:424cd8b7203c | 271 | char SLAVE::Recibe() |
williequesada | 0:424cd8b7203c | 272 | { |
williequesada | 0:424cd8b7203c | 273 | if(Slave_Counter>0) { |
williequesada | 0:424cd8b7203c | 274 | Slave_Counter--; |
williequesada | 0:424cd8b7203c | 275 | return Slave_Buffer[Slave_Counter]; |
williequesada | 0:424cd8b7203c | 276 | } else { |
williequesada | 0:424cd8b7203c | 277 | return NO_DATA; |
williequesada | 0:424cd8b7203c | 278 | } |
williequesada | 0:424cd8b7203c | 279 | } |
williequesada | 0:424cd8b7203c | 280 | |
williequesada | 0:424cd8b7203c | 281 | bool SLAVE::Answer() |
williequesada | 0:424cd8b7203c | 282 | { |
williequesada | 0:424cd8b7203c | 283 | if(Slave_Counter>0) { |
williequesada | 0:424cd8b7203c | 284 | Slave_Counter--; |
williequesada | 0:424cd8b7203c | 285 | if(Slave_Buffer[Slave_Counter]==NEXT_STEP) { |
williequesada | 0:424cd8b7203c | 286 | return 1; |
williequesada | 0:424cd8b7203c | 287 | } else { |
williequesada | 0:424cd8b7203c | 288 | return 0; |
williequesada | 0:424cd8b7203c | 289 | } |
williequesada | 0:424cd8b7203c | 290 | } |
williequesada | 0:424cd8b7203c | 291 | return 0; |
williequesada | 0:424cd8b7203c | 292 | } |
williequesada | 0:424cd8b7203c | 293 | |
williequesada | 0:424cd8b7203c | 294 | void SLAVE::Awake() |
williequesada | 0:424cd8b7203c | 295 | { |
pabloandres2906 | 2:1141f1fb0761 | 296 | _AWAKE=1; //despierta al esclavo con un flanco positivo |
williequesada | 0:424cd8b7203c | 297 | wait_us(50); |
pabloandres2906 | 2:1141f1fb0761 | 298 | _AWAKE=0; //se vuelve a poner en cero para que el proximo AWAKE=1 sea un flanco positivo |
williequesada | 0:424cd8b7203c | 299 | } |
williequesada | 0:424cd8b7203c | 300 | |
williequesada | 0:424cd8b7203c | 301 | void SLAVE::Sleep() |
williequesada | 0:424cd8b7203c | 302 | { |
williequesada | 0:424cd8b7203c | 303 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 304 | Uart.putc(NEXT_SLEEP); |
williequesada | 0:424cd8b7203c | 305 | } else { |
williequesada | 0:424cd8b7203c | 306 | wait_ms(500); |
williequesada | 0:424cd8b7203c | 307 | if(Uart.writeable()) { |
williequesada | 0:424cd8b7203c | 308 | Uart.putc(NEXT_SLEEP); |
williequesada | 0:424cd8b7203c | 309 | } |
williequesada | 0:424cd8b7203c | 310 | } |
williequesada | 0:424cd8b7203c | 311 | |
williequesada | 0:424cd8b7203c | 312 | } |
williequesada | 0:424cd8b7203c | 313 | |
williequesada | 0:424cd8b7203c | 314 | void SLAVE::UartInterruption() |
williequesada | 0:424cd8b7203c | 315 | { |
williequesada | 0:424cd8b7203c | 316 | if(Uart.readable()) { |
williequesada | 0:424cd8b7203c | 317 | Slave_Buffer[Slave_Counter]=Uart.getc(); |
williequesada | 0:424cd8b7203c | 318 | Slave_Counter++; |
williequesada | 0:424cd8b7203c | 319 | } |
williequesada | 0:424cd8b7203c | 320 | } |