posilani dat

Dependencies:   FatFileSystemCpp mbed PowerControl USBHostLite

Committer:
PavelKumpan
Date:
Tue May 23 18:42:14 2017 +0000
Revision:
26:5674b8978551
Parent:
20:66ecb2f0e307
Recreated communication protocol.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jkaderka 4:030c7726c7dc 1 #include "wifi.h"
jkaderka 4:030c7726c7dc 2 #include "utils.h"
jkaderka 4:030c7726c7dc 3
legwinskij 18:7acae34b518d 4 #define BAUDR 460800
legwinskij 20:66ecb2f0e307 5 //#define BAUDR 1100000
jkaderka 4:030c7726c7dc 6
legwinskij 20:66ecb2f0e307 7 Wifi::Wifi (PinName tx, PinName rx, PinName cts, PinName reset):
jkaderka 12:e3cb430ec051 8 wifi_(tx, rx) {
legwinskij 20:66ecb2f0e307 9 // mbed only has CTS available, communication not working properly
legwinskij 20:66ecb2f0e307 10 //wifi_.set_flow_control(SerialBase::CTS, cts);
jkaderka 12:e3cb430ec051 11 wifi_.baud(BAUDR);
jkaderka 4:030c7726c7dc 12 }
jkaderka 4:030c7726c7dc 13
legwinskij 20:66ecb2f0e307 14 /*
legwinskij 20:66ecb2f0e307 15 * Initializes wifly, serves as constructor, were changing PLL speed dynamically
legwinskij 20:66ecb2f0e307 16 *
legwinskij 20:66ecb2f0e307 17 */
legwinskij 20:66ecb2f0e307 18 void Wifi::init(void)
legwinskij 20:66ecb2f0e307 19 {
legwinskij 20:66ecb2f0e307 20 //wifi_.baud(BAUDR);
legwinskij 20:66ecb2f0e307 21 }
legwinskij 20:66ecb2f0e307 22
jkaderka 4:030c7726c7dc 23 /*
jkaderka 4:030c7726c7dc 24 * Format: (int) -1 (int) -1 (int) swimmer_id
jkaderka 12:e3cb430ec051 25 * many times (int) count 3*(short) acc 3*(float)gyro
jkaderka 12:e3cb430ec051 26 * (int) -1 (int) -1 up to 1023 zeros
jkaderka 4:030c7726c7dc 27 */
legwinskij 20:66ecb2f0e307 28 int Wifi::sendFile(const char *fname)
jkaderka 4:030c7726c7dc 29 {
jkaderka 12:e3cb430ec051 30 char c;
jkaderka 12:e3cb430ec051 31 int last = 1;
jkaderka 4:030c7726c7dc 32
legwinskij 17:ca53e6d36163 33 FILE *file = fopen(fname, "rb");
legwinskij 15:baa2672a9b38 34 if (file == NULL) {
legwinskij 18:7acae34b518d 35 printf("Unable to open %s\r\n", fname);
jkaderka 10:fdf9ca254549 36 return -1;
jkaderka 10:fdf9ca254549 37 }
PavelKumpan 26:5674b8978551 38
PavelKumpan 26:5674b8978551 39 fseek(file, 0, SEEK_END); // seek to end of file
PavelKumpan 26:5674b8978551 40 int size = ftell(file); // get current file pointer
PavelKumpan 26:5674b8978551 41 fseek(file, 0, SEEK_SET); // seek back to beginning of file
PavelKumpan 26:5674b8978551 42
PavelKumpan 26:5674b8978551 43 wifi_.putc('#'); // send ACK
PavelKumpan 26:5674b8978551 44 wifi_.putc('A');
PavelKumpan 26:5674b8978551 45 for(int i = 0; i < FRAME_HEADER_LEN - 2; i++) // send num of bytes in the message
PavelKumpan 26:5674b8978551 46 {
PavelKumpan 26:5674b8978551 47 wifi_.putc((char)((size >> (i * 8)) & 0xFF));
PavelKumpan 26:5674b8978551 48 }
PavelKumpan 26:5674b8978551 49
PavelKumpan 26:5674b8978551 50 printf("Ack sended...\r\n");
PavelKumpan 26:5674b8978551 51 printf("Transfer of %d bytes initialized...\r\n", size);
PavelKumpan 26:5674b8978551 52
PavelKumpan 26:5674b8978551 53 if(size == 0) // when nothing to send, terminated here
PavelKumpan 26:5674b8978551 54 {
PavelKumpan 26:5674b8978551 55 return 0;
PavelKumpan 26:5674b8978551 56 }
PavelKumpan 26:5674b8978551 57
jkaderka 12:e3cb430ec051 58 in_buf = 0;
legwinskij 15:baa2672a9b38 59 while (fread(&c, sizeof(char), 1, file) != 0) {
jkaderka 12:e3cb430ec051 60 if ((last = bufferSendVerify(c)) == -1) {
legwinskij 15:baa2672a9b38 61 fclose(file);
jkaderka 12:e3cb430ec051 62 return -1;
jkaderka 12:e3cb430ec051 63 }
jkaderka 10:fdf9ca254549 64 }
PavelKumpan 26:5674b8978551 65 fclose(file);
PavelKumpan 26:5674b8978551 66
PavelKumpan 26:5674b8978551 67 if (bufferFlush() == -1) {
PavelKumpan 26:5674b8978551 68 return -1;
jkaderka 12:e3cb430ec051 69 }
jkaderka 4:030c7726c7dc 70
jkaderka 4:030c7726c7dc 71 return 0;
jkaderka 4:030c7726c7dc 72 }
jkaderka 4:030c7726c7dc 73
jkaderka 4:030c7726c7dc 74 /*
PavelKumpan 26:5674b8978551 75 * Returns length of command data received, load the command into the cmd array and the data into the data array.
jkaderka 4:030c7726c7dc 76 */
PavelKumpan 26:5674b8978551 77 int Wifi::getCmd(char* cmd, char* data)
jkaderka 4:030c7726c7dc 78 {
PavelKumpan 26:5674b8978551 79 short dataLength = 0u;
PavelKumpan 26:5674b8978551 80 cmd[0] = '#';
PavelKumpan 26:5674b8978551 81 cmd[1] = 'N';
PavelKumpan 26:5674b8978551 82
PavelKumpan 26:5674b8978551 83 /* Read the command */
legwinskij 15:baa2672a9b38 84 if (wifi_.readable() && wifi_.getc() == '#')
legwinskij 15:baa2672a9b38 85 {
PavelKumpan 26:5674b8978551 86 for(int i = 1; i < FRAME_HEADER_LEN; i++)
PavelKumpan 26:5674b8978551 87 {
PavelKumpan 26:5674b8978551 88 wait_ms(20);
PavelKumpan 26:5674b8978551 89 if (wifi_.readable())
PavelKumpan 26:5674b8978551 90 {
PavelKumpan 26:5674b8978551 91 cmd[i] = wifi_.getc();
PavelKumpan 26:5674b8978551 92 }
PavelKumpan 26:5674b8978551 93 else
PavelKumpan 26:5674b8978551 94 {
PavelKumpan 26:5674b8978551 95 cmd[1] = 'N';
PavelKumpan 26:5674b8978551 96 }
PavelKumpan 26:5674b8978551 97 }
PavelKumpan 26:5674b8978551 98 }
PavelKumpan 26:5674b8978551 99
PavelKumpan 26:5674b8978551 100 /* Read count of data */
PavelKumpan 26:5674b8978551 101 if(cmd[1] == 'N')
PavelKumpan 26:5674b8978551 102 {
PavelKumpan 26:5674b8978551 103 return 0;
PavelKumpan 26:5674b8978551 104 }
PavelKumpan 26:5674b8978551 105
PavelKumpan 26:5674b8978551 106 for(int i = 0; i < FRAME_HEADER_LEN - 2; i++)
PavelKumpan 26:5674b8978551 107 {
PavelKumpan 26:5674b8978551 108 dataLength += (int)cmd[i+2] << (i * 8);
PavelKumpan 26:5674b8978551 109 }
PavelKumpan 26:5674b8978551 110
PavelKumpan 26:5674b8978551 111 /* Read data */
PavelKumpan 26:5674b8978551 112 for(int i = 0; i < dataLength; i++)
PavelKumpan 26:5674b8978551 113 {
legwinskij 20:66ecb2f0e307 114 wait_ms(20);
legwinskij 20:66ecb2f0e307 115 if (wifi_.readable())
legwinskij 20:66ecb2f0e307 116 {
PavelKumpan 26:5674b8978551 117 data[i] = wifi_.getc();
legwinskij 20:66ecb2f0e307 118 }
legwinskij 15:baa2672a9b38 119 }
PavelKumpan 26:5674b8978551 120
PavelKumpan 26:5674b8978551 121 return dataLength;
jkaderka 4:030c7726c7dc 122 }
jkaderka 4:030c7726c7dc 123
legwinskij 17:ca53e6d36163 124 /*
legwinskij 17:ca53e6d36163 125 * Sends given byte to wifly
legwinskij 17:ca53e6d36163 126 */
legwinskij 17:ca53e6d36163 127 void Wifi::sendByte(char byte)
legwinskij 17:ca53e6d36163 128 {
legwinskij 17:ca53e6d36163 129 // Send byte
legwinskij 17:ca53e6d36163 130 wifi_.putc(byte);
legwinskij 17:ca53e6d36163 131 }
legwinskij 17:ca53e6d36163 132
legwinskij 17:ca53e6d36163 133 /*
legwinskij 17:ca53e6d36163 134 * Reads byte from wifly
legwinskij 17:ca53e6d36163 135 */
legwinskij 20:66ecb2f0e307 136 char Wifi::readByte(void)
legwinskij 17:ca53e6d36163 137 {
legwinskij 17:ca53e6d36163 138 // Read byte
legwinskij 17:ca53e6d36163 139 return wifi_.getc();
legwinskij 17:ca53e6d36163 140 }
legwinskij 17:ca53e6d36163 141
legwinskij 20:66ecb2f0e307 142 /*
legwinskij 20:66ecb2f0e307 143 * Returns true if some bytes are in the buffer
legwinskij 20:66ecb2f0e307 144 */
legwinskij 20:66ecb2f0e307 145 bool Wifi::readable(void)
legwinskij 20:66ecb2f0e307 146 {
legwinskij 20:66ecb2f0e307 147 if (wifi_.readable())
legwinskij 20:66ecb2f0e307 148 {
legwinskij 20:66ecb2f0e307 149 return true;
legwinskij 20:66ecb2f0e307 150 }
legwinskij 20:66ecb2f0e307 151 else
legwinskij 20:66ecb2f0e307 152 {
legwinskij 20:66ecb2f0e307 153 return false;
legwinskij 20:66ecb2f0e307 154 }
legwinskij 20:66ecb2f0e307 155 }
legwinskij 20:66ecb2f0e307 156
legwinskij 20:66ecb2f0e307 157 /*
legwinskij 20:66ecb2f0e307 158 * Sends ACK to wiflys UART
legwinskij 20:66ecb2f0e307 159 */
legwinskij 20:66ecb2f0e307 160 void Wifi::sendAck(void)
legwinskij 20:66ecb2f0e307 161 {
legwinskij 20:66ecb2f0e307 162 wifi_.putc('#');
legwinskij 20:66ecb2f0e307 163 wifi_.putc('A');
PavelKumpan 26:5674b8978551 164 for(int i = 0; i < FRAME_HEADER_LEN - 2; i++)
PavelKumpan 26:5674b8978551 165 {
PavelKumpan 26:5674b8978551 166 wifi_.putc(0x0);
PavelKumpan 26:5674b8978551 167 }
legwinskij 20:66ecb2f0e307 168 }
legwinskij 20:66ecb2f0e307 169
legwinskij 20:66ecb2f0e307 170 /*
legwinskij 20:66ecb2f0e307 171 * Sends NACK to wiflys UART
legwinskij 20:66ecb2f0e307 172 */
legwinskij 20:66ecb2f0e307 173 void Wifi::sendNack(void)
legwinskij 20:66ecb2f0e307 174 {
legwinskij 20:66ecb2f0e307 175 wifi_.putc('#');
legwinskij 20:66ecb2f0e307 176 wifi_.putc('N');
PavelKumpan 26:5674b8978551 177 for(int i = 0; i < FRAME_HEADER_LEN - 2; i++)
PavelKumpan 26:5674b8978551 178 {
PavelKumpan 26:5674b8978551 179 wifi_.putc(0x0);
PavelKumpan 26:5674b8978551 180 }
PavelKumpan 26:5674b8978551 181 }
PavelKumpan 26:5674b8978551 182
PavelKumpan 26:5674b8978551 183 /*
PavelKumpan 26:5674b8978551 184 * Sends NACK to wiflys UART
PavelKumpan 26:5674b8978551 185 */
PavelKumpan 26:5674b8978551 186 void Wifi::sendFail(void)
PavelKumpan 26:5674b8978551 187 {
PavelKumpan 26:5674b8978551 188 wifi_.putc('#');
PavelKumpan 26:5674b8978551 189 wifi_.putc('F');
PavelKumpan 26:5674b8978551 190 for(int i = 0; i < FRAME_HEADER_LEN - 2; i++)
PavelKumpan 26:5674b8978551 191 {
PavelKumpan 26:5674b8978551 192 wifi_.putc(0x0);
PavelKumpan 26:5674b8978551 193 }
PavelKumpan 26:5674b8978551 194 }
PavelKumpan 26:5674b8978551 195
PavelKumpan 26:5674b8978551 196 int Wifi::waitForAck()
PavelKumpan 26:5674b8978551 197 {
PavelKumpan 26:5674b8978551 198 char cmd[FRAME_HEADER_LEN];
PavelKumpan 26:5674b8978551 199 char data[256];
PavelKumpan 26:5674b8978551 200
PavelKumpan 26:5674b8978551 201 for (int i=0; i<64; i++)
PavelKumpan 26:5674b8978551 202 {
PavelKumpan 26:5674b8978551 203 getCmd(cmd, data);
PavelKumpan 26:5674b8978551 204
PavelKumpan 26:5674b8978551 205 if ('A' == cmd[1])
PavelKumpan 26:5674b8978551 206 {
PavelKumpan 26:5674b8978551 207 return 1;
PavelKumpan 26:5674b8978551 208 }
PavelKumpan 26:5674b8978551 209 else if ('F' == cmd[1])
PavelKumpan 26:5674b8978551 210 {
PavelKumpan 26:5674b8978551 211 return 0;
PavelKumpan 26:5674b8978551 212 }
PavelKumpan 26:5674b8978551 213 else
PavelKumpan 26:5674b8978551 214 {
PavelKumpan 26:5674b8978551 215 wait_ms(5);
PavelKumpan 26:5674b8978551 216 }
PavelKumpan 26:5674b8978551 217 }
PavelKumpan 26:5674b8978551 218 return -1;
PavelKumpan 26:5674b8978551 219
PavelKumpan 26:5674b8978551 220 //if (wifi_.getc() == 'A')
PavelKumpan 26:5674b8978551 221 // break;
legwinskij 20:66ecb2f0e307 222 }
legwinskij 20:66ecb2f0e307 223
jkaderka 4:030c7726c7dc 224 /* ********************************
jkaderka 4:030c7726c7dc 225 * private
jkaderka 4:030c7726c7dc 226 * *******************************/
PavelKumpan 26:5674b8978551 227
PavelKumpan 26:5674b8978551 228 void Wifi::bufferSend(size_t size)
jkaderka 4:030c7726c7dc 229 {
jkaderka 4:030c7726c7dc 230 int i;
jkaderka 12:e3cb430ec051 231 for (i = 0; i < size; i++) {
jkaderka 4:030c7726c7dc 232 wifi_.putc(buffer[i]);
jkaderka 12:e3cb430ec051 233 }
jkaderka 12:e3cb430ec051 234 }
jkaderka 12:e3cb430ec051 235
PavelKumpan 26:5674b8978551 236 int Wifi::bufferFlush()
PavelKumpan 26:5674b8978551 237 {
PavelKumpan 26:5674b8978551 238 LPC_WDT->WDFEED = 0xAA;
PavelKumpan 26:5674b8978551 239 LPC_WDT->WDFEED = 0x55;
PavelKumpan 26:5674b8978551 240 int counter = 0;
PavelKumpan 26:5674b8978551 241 int result = 0;
PavelKumpan 26:5674b8978551 242
PavelKumpan 26:5674b8978551 243 if (in_buf == 0)
PavelKumpan 26:5674b8978551 244 {
PavelKumpan 26:5674b8978551 245 return 1;
PavelKumpan 26:5674b8978551 246 }
PavelKumpan 26:5674b8978551 247
PavelKumpan 26:5674b8978551 248 while (counter++ < 10)
PavelKumpan 26:5674b8978551 249 {
PavelKumpan 26:5674b8978551 250 bufferSend(in_buf);
PavelKumpan 26:5674b8978551 251 result = waitForAck();
PavelKumpan 26:5674b8978551 252
PavelKumpan 26:5674b8978551 253 if(result == 1)
PavelKumpan 26:5674b8978551 254 {
PavelKumpan 26:5674b8978551 255 /* Ack - break, no need to send it again */
PavelKumpan 26:5674b8978551 256 break;
PavelKumpan 26:5674b8978551 257 }
PavelKumpan 26:5674b8978551 258 else if (result == -1)
PavelKumpan 26:5674b8978551 259 {
PavelKumpan 26:5674b8978551 260 /* Fail - transmition faild, terminate sending */
PavelKumpan 26:5674b8978551 261 return -1;
PavelKumpan 26:5674b8978551 262 }
PavelKumpan 26:5674b8978551 263 else
PavelKumpan 26:5674b8978551 264 {
PavelKumpan 26:5674b8978551 265 /* Nack - send it again*/
PavelKumpan 26:5674b8978551 266 }
PavelKumpan 26:5674b8978551 267 }
PavelKumpan 26:5674b8978551 268
PavelKumpan 26:5674b8978551 269 if (counter >= 10)
PavelKumpan 26:5674b8978551 270 {
PavelKumpan 26:5674b8978551 271 return -1;
PavelKumpan 26:5674b8978551 272 }
PavelKumpan 26:5674b8978551 273 else
PavelKumpan 26:5674b8978551 274 {
PavelKumpan 26:5674b8978551 275 return 0;
PavelKumpan 26:5674b8978551 276 }
PavelKumpan 26:5674b8978551 277 }
PavelKumpan 26:5674b8978551 278
jkaderka 12:e3cb430ec051 279 int Wifi::bufferSendVerify(char c)
jkaderka 12:e3cb430ec051 280 {
legwinskij 19:c2476c0ea3e0 281 LPC_WDT->WDFEED = 0xAA;
legwinskij 19:c2476c0ea3e0 282 LPC_WDT->WDFEED = 0x55;
jkaderka 12:e3cb430ec051 283 int counter = 0;
PavelKumpan 26:5674b8978551 284 int result = 0;
jkaderka 12:e3cb430ec051 285 buffer[in_buf] = c;
jkaderka 12:e3cb430ec051 286 in_buf++;
jkaderka 12:e3cb430ec051 287
jkaderka 12:e3cb430ec051 288 if (in_buf != SEND_SIZE)
PavelKumpan 26:5674b8978551 289 {
jkaderka 12:e3cb430ec051 290 return 1;
PavelKumpan 26:5674b8978551 291 }
jkaderka 12:e3cb430ec051 292
jkaderka 12:e3cb430ec051 293 in_buf = 0;
PavelKumpan 26:5674b8978551 294 while (counter++ < 16)
PavelKumpan 26:5674b8978551 295 {
PavelKumpan 26:5674b8978551 296 bufferSend(SEND_SIZE);
PavelKumpan 26:5674b8978551 297 result = waitForAck();
PavelKumpan 26:5674b8978551 298
PavelKumpan 26:5674b8978551 299 if(result == 1)
PavelKumpan 26:5674b8978551 300 {
PavelKumpan 26:5674b8978551 301 /* Ack - break, no need to send it again */
PavelKumpan 26:5674b8978551 302 break;
PavelKumpan 26:5674b8978551 303 }
PavelKumpan 26:5674b8978551 304 else if (result == -1)
legwinskij 20:66ecb2f0e307 305 {
PavelKumpan 26:5674b8978551 306 /* Fail - transmition faild, terminate sending */
PavelKumpan 26:5674b8978551 307 return -1;
PavelKumpan 26:5674b8978551 308 }
PavelKumpan 26:5674b8978551 309 else
PavelKumpan 26:5674b8978551 310 {
PavelKumpan 26:5674b8978551 311 /* Nack - send it again*/
legwinskij 20:66ecb2f0e307 312 }
jkaderka 12:e3cb430ec051 313 }
PavelKumpan 26:5674b8978551 314
jkaderka 12:e3cb430ec051 315 if (counter >= 10)
PavelKumpan 26:5674b8978551 316 {
jkaderka 12:e3cb430ec051 317 return -1;
PavelKumpan 26:5674b8978551 318 }
PavelKumpan 26:5674b8978551 319 else
PavelKumpan 26:5674b8978551 320 {
PavelKumpan 26:5674b8978551 321 return 0;
PavelKumpan 26:5674b8978551 322 }
jkaderka 4:030c7726c7dc 323 }