test
Dependencies: Nanopb iSerial mbed BaseJpegDecode FatFileSystem SDFileSystem RingBuffer Camera_LS_Y201
main.cpp@0:d69efd0ee139, 2014-09-18 (annotated)
- Committer:
- cgraham
- Date:
- Thu Sep 18 15:21:47 2014 +0000
- Revision:
- 0:d69efd0ee139
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cgraham | 0:d69efd0ee139 | 1 | /***************************************************************************************************** |
cgraham | 0:d69efd0ee139 | 2 | DUMB BOX firmware 1.0 |
cgraham | 0:d69efd0ee139 | 3 | 07/30/14 |
cgraham | 0:d69efd0ee139 | 4 | |
cgraham | 0:d69efd0ee139 | 5 | Takes picture at time 0. Takes picture at set time. Send 2 jpeg files upon request from Android phone. |
cgraham | 0:d69efd0ee139 | 6 | A switch takes the first picture. |
cgraham | 0:d69efd0ee139 | 7 | Bluetooth input data to set time to take second picture. |
cgraham | 0:d69efd0ee139 | 8 | Send picture via Bluetooth, if possible. |
cgraham | 0:d69efd0ee139 | 9 | |
cgraham | 0:d69efd0ee139 | 10 | ***************************************************************************************************/ |
cgraham | 0:d69efd0ee139 | 11 | |
cgraham | 0:d69efd0ee139 | 12 | |
cgraham | 0:d69efd0ee139 | 13 | // |
cgraham | 0:d69efd0ee139 | 14 | // Pin function |
cgraham | 0:d69efd0ee139 | 15 | // P5 |
cgraham | 0:d69efd0ee139 | 16 | // P6 |
cgraham | 0:d69efd0ee139 | 17 | // P7 |
cgraham | 0:d69efd0ee139 | 18 | // P8 |
cgraham | 0:d69efd0ee139 | 19 | // P9 UART_TX; Bluetooth interface TX (Bluetooth side: RX) |
cgraham | 0:d69efd0ee139 | 20 | // P10 UART_RX; Bluetooth interface RX (Bluetooth side: TX) |
cgraham | 0:d69efd0ee139 | 21 | // P11 |
cgraham | 0:d69efd0ee139 | 22 | // P12 |
cgraham | 0:d69efd0ee139 | 23 | // P13 |
cgraham | 0:d69efd0ee139 | 24 | // P14 |
cgraham | 0:d69efd0ee139 | 25 | // P15 |
cgraham | 0:d69efd0ee139 | 26 | // P16 |
cgraham | 0:d69efd0ee139 | 27 | // P17 |
cgraham | 0:d69efd0ee139 | 28 | // P18 |
cgraham | 0:d69efd0ee139 | 29 | // P19 |
cgraham | 0:d69efd0ee139 | 30 | // P20 Battery Analog In |
cgraham | 0:d69efd0ee139 | 31 | // P21 Green LED 1 |
cgraham | 0:d69efd0ee139 | 32 | // P22 RED LED 2 |
cgraham | 0:d69efd0ee139 | 33 | // P23 LED illumination //LW514 LED WHITE ROUND CLEAR 5mm; 897-1183-ND |
cgraham | 0:d69efd0ee139 | 34 | // P24 |
cgraham | 0:d69efd0ee139 | 35 | // P25 Bluetooth On/Off |
cgraham | 0:d69efd0ee139 | 36 | // P26 |
cgraham | 0:d69efd0ee139 | 37 | // P27 UART_RX; Image Sensor interface (Camera side: TX) |
cgraham | 0:d69efd0ee139 | 38 | // P28 UART_TX; Image Sensor interface (Camera side: RX) |
cgraham | 0:d69efd0ee139 | 39 | // P29 Start_Button |
cgraham | 0:d69efd0ee139 | 40 | // P30 |
cgraham | 0:d69efd0ee139 | 41 | // |
cgraham | 0:d69efd0ee139 | 42 | // |
cgraham | 0:d69efd0ee139 | 43 | |
cgraham | 0:d69efd0ee139 | 44 | #include "mbed.h" |
cgraham | 0:d69efd0ee139 | 45 | #include "Camera_LS_Y201.h" |
cgraham | 0:d69efd0ee139 | 46 | #include "SDFileSystem.h" |
cgraham | 0:d69efd0ee139 | 47 | #include "SimpleJpegDecode.h" |
cgraham | 0:d69efd0ee139 | 48 | #include "pb_decode.h" |
cgraham | 0:d69efd0ee139 | 49 | #include "pb_encode.h" |
cgraham | 0:d69efd0ee139 | 50 | #include "pb.h" |
cgraham | 0:d69efd0ee139 | 51 | #include "vocit4.pb.h" |
cgraham | 0:d69efd0ee139 | 52 | #include "iSerial.h" |
cgraham | 0:d69efd0ee139 | 53 | |
cgraham | 0:d69efd0ee139 | 54 | |
cgraham | 0:d69efd0ee139 | 55 | #define DEMO_FILE "/local/input.jpg" |
cgraham | 0:d69efd0ee139 | 56 | #define DEBMSG printf |
cgraham | 0:d69efd0ee139 | 57 | #define NEWLINE() printf("\r\n") |
cgraham | 0:d69efd0ee139 | 58 | #define image_width 480 |
cgraham | 0:d69efd0ee139 | 59 | #define image_height 640 |
cgraham | 0:d69efd0ee139 | 60 | #define USE_SDCARD 0 |
cgraham | 0:d69efd0ee139 | 61 | #define Setting "/local/setting.txt" |
cgraham | 0:d69efd0ee139 | 62 | #define ON true |
cgraham | 0:d69efd0ee139 | 63 | #define OFF false |
cgraham | 0:d69efd0ee139 | 64 | #define Pressed 0 |
cgraham | 0:d69efd0ee139 | 65 | |
cgraham | 0:d69efd0ee139 | 66 | |
cgraham | 0:d69efd0ee139 | 67 | /* |
cgraham | 0:d69efd0ee139 | 68 | #if USE_SDCARD |
cgraham | 0:d69efd0ee139 | 69 | #define FILENAME "/sd/IMG_%04d.jpg" |
cgraham | 0:d69efd0ee139 | 70 | SDFileSystem fs(p5, p6, p7, p8, "sd"); |
cgraham | 0:d69efd0ee139 | 71 | #else |
cgraham | 0:d69efd0ee139 | 72 | #define FILENAME "/local/IMG_%04d.jpg" |
cgraham | 0:d69efd0ee139 | 73 | LocalFileSystem fs("local"); |
cgraham | 0:d69efd0ee139 | 74 | #endif |
cgraham | 0:d69efd0ee139 | 75 | Camera_LS_Y201 cam1(p28, p27);//(p13, p14); |
cgraham | 0:d69efd0ee139 | 76 | */ |
cgraham | 0:d69efd0ee139 | 77 | |
cgraham | 0:d69efd0ee139 | 78 | #if USE_SDCARD |
cgraham | 0:d69efd0ee139 | 79 | #define FILENAME "/sd/INIT%03d.jpg" |
cgraham | 0:d69efd0ee139 | 80 | #define FILENAME2 "/sd/FINAL%03d.jpg" |
cgraham | 0:d69efd0ee139 | 81 | SDFileSystem fs(p5, p6, p7, p8, "sd"); |
cgraham | 0:d69efd0ee139 | 82 | #else |
cgraham | 0:d69efd0ee139 | 83 | #define FILENAME "/local/INIT%03d.jpg" |
cgraham | 0:d69efd0ee139 | 84 | #define FILENAME2 "/local/FINAL%03d.jpg" |
cgraham | 0:d69efd0ee139 | 85 | LocalFileSystem fs("local"); |
cgraham | 0:d69efd0ee139 | 86 | #endif |
cgraham | 0:d69efd0ee139 | 87 | Camera_LS_Y201 cam1(p28, p27);//(p13, p14); |
cgraham | 0:d69efd0ee139 | 88 | SimpleJpegDecode decode; |
cgraham | 0:d69efd0ee139 | 89 | |
cgraham | 0:d69efd0ee139 | 90 | //_____________________________________________________________________________________________________ |
cgraham | 0:d69efd0ee139 | 91 | //Camera set up |
cgraham | 0:d69efd0ee139 | 92 | |
cgraham | 0:d69efd0ee139 | 93 | typedef struct work { |
cgraham | 0:d69efd0ee139 | 94 | FILE *fp; |
cgraham | 0:d69efd0ee139 | 95 | } work_t; |
cgraham | 0:d69efd0ee139 | 96 | |
cgraham | 0:d69efd0ee139 | 97 | work_t work; |
cgraham | 0:d69efd0ee139 | 98 | |
cgraham | 0:d69efd0ee139 | 99 | /** |
cgraham | 0:d69efd0ee139 | 100 | * Callback function for readJpegFileContent. |
cgraham | 0:d69efd0ee139 | 101 | * |
cgraham | 0:d69efd0ee139 | 102 | * @param buf A pointer to a buffer. |
cgraham | 0:d69efd0ee139 | 103 | * @param siz A size of the buffer. |
cgraham | 0:d69efd0ee139 | 104 | */ |
cgraham | 0:d69efd0ee139 | 105 | void callback_func(int done, int total, uint8_t *buf, size_t siz) { |
cgraham | 0:d69efd0ee139 | 106 | fwrite(buf, siz, 1, work.fp); |
cgraham | 0:d69efd0ee139 | 107 | |
cgraham | 0:d69efd0ee139 | 108 | static int n = 0; |
cgraham | 0:d69efd0ee139 | 109 | int tmp = done * 100 / total; |
cgraham | 0:d69efd0ee139 | 110 | if (n != tmp) { |
cgraham | 0:d69efd0ee139 | 111 | n = tmp; |
cgraham | 0:d69efd0ee139 | 112 | if ((n % 10) == 0) |
cgraham | 0:d69efd0ee139 | 113 | { |
cgraham | 0:d69efd0ee139 | 114 | DEBMSG("Writing...: %3d%%", n); |
cgraham | 0:d69efd0ee139 | 115 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 116 | } |
cgraham | 0:d69efd0ee139 | 117 | } |
cgraham | 0:d69efd0ee139 | 118 | } |
cgraham | 0:d69efd0ee139 | 119 | |
cgraham | 0:d69efd0ee139 | 120 | /** |
cgraham | 0:d69efd0ee139 | 121 | * Capture. |
cgraham | 0:d69efd0ee139 | 122 | * |
cgraham | 0:d69efd0ee139 | 123 | * @param cam A pointer to a camera object. |
cgraham | 0:d69efd0ee139 | 124 | * @param filename The file name. |
cgraham | 0:d69efd0ee139 | 125 | * |
cgraham | 0:d69efd0ee139 | 126 | * @return Return 0 if it succeed. |
cgraham | 0:d69efd0ee139 | 127 | */ |
cgraham | 0:d69efd0ee139 | 128 | int capture(Camera_LS_Y201 *cam, char *filename) { |
cgraham | 0:d69efd0ee139 | 129 | /* |
cgraham | 0:d69efd0ee139 | 130 | * Take a picture. |
cgraham | 0:d69efd0ee139 | 131 | */ |
cgraham | 0:d69efd0ee139 | 132 | if (cam->takePicture() != 0) { |
cgraham | 0:d69efd0ee139 | 133 | return -1; |
cgraham | 0:d69efd0ee139 | 134 | } |
cgraham | 0:d69efd0ee139 | 135 | DEBMSG("Captured."); |
cgraham | 0:d69efd0ee139 | 136 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 137 | |
cgraham | 0:d69efd0ee139 | 138 | /* |
cgraham | 0:d69efd0ee139 | 139 | * Open file. |
cgraham | 0:d69efd0ee139 | 140 | */ |
cgraham | 0:d69efd0ee139 | 141 | work.fp = fopen(filename, "wb"); |
cgraham | 0:d69efd0ee139 | 142 | if (work.fp == NULL) { |
cgraham | 0:d69efd0ee139 | 143 | return -2; |
cgraham | 0:d69efd0ee139 | 144 | } |
cgraham | 0:d69efd0ee139 | 145 | |
cgraham | 0:d69efd0ee139 | 146 | /* |
cgraham | 0:d69efd0ee139 | 147 | * Read the content. |
cgraham | 0:d69efd0ee139 | 148 | */ |
cgraham | 0:d69efd0ee139 | 149 | DEBMSG("%s", filename); |
cgraham | 0:d69efd0ee139 | 150 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 151 | if (cam->readJpegFileContent(callback_func) != 0) { |
cgraham | 0:d69efd0ee139 | 152 | fclose(work.fp); |
cgraham | 0:d69efd0ee139 | 153 | return -3; |
cgraham | 0:d69efd0ee139 | 154 | } |
cgraham | 0:d69efd0ee139 | 155 | fclose(work.fp); |
cgraham | 0:d69efd0ee139 | 156 | |
cgraham | 0:d69efd0ee139 | 157 | /* |
cgraham | 0:d69efd0ee139 | 158 | * Stop taking pictures. |
cgraham | 0:d69efd0ee139 | 159 | */ |
cgraham | 0:d69efd0ee139 | 160 | cam->stopTakingPictures(); |
cgraham | 0:d69efd0ee139 | 161 | |
cgraham | 0:d69efd0ee139 | 162 | return 0; |
cgraham | 0:d69efd0ee139 | 163 | } |
cgraham | 0:d69efd0ee139 | 164 | |
cgraham | 0:d69efd0ee139 | 165 | //_________________________________________________________________________________________________________ |
cgraham | 0:d69efd0ee139 | 166 | //General I/O and COM set up |
cgraham | 0:d69efd0ee139 | 167 | |
cgraham | 0:d69efd0ee139 | 168 | |
cgraham | 0:d69efd0ee139 | 169 | Serial pc(USBTX, USBRX); // tx, rx, using usb program port for debug |
cgraham | 0:d69efd0ee139 | 170 | iSerial bluetooth(p9, p10); // UART interface to bluetooth module |
cgraham | 0:d69efd0ee139 | 171 | |
cgraham | 0:d69efd0ee139 | 172 | //Input |
cgraham | 0:d69efd0ee139 | 173 | DigitalIn Start(p29); |
cgraham | 0:d69efd0ee139 | 174 | AnalogIn Batt_stat(p20); |
cgraham | 0:d69efd0ee139 | 175 | |
cgraham | 0:d69efd0ee139 | 176 | //Output |
cgraham | 0:d69efd0ee139 | 177 | DigitalOut led_green(p21); |
cgraham | 0:d69efd0ee139 | 178 | DigitalOut led_red(p22); |
cgraham | 0:d69efd0ee139 | 179 | DigitalOut led_illuminate(p23); |
cgraham | 0:d69efd0ee139 | 180 | |
cgraham | 0:d69efd0ee139 | 181 | DigitalOut Camera_power(p24); |
cgraham | 0:d69efd0ee139 | 182 | //DigitalOut Bluetooth_power(p25); |
cgraham | 0:d69efd0ee139 | 183 | |
cgraham | 0:d69efd0ee139 | 184 | //Variables |
cgraham | 0:d69efd0ee139 | 185 | |
cgraham | 0:d69efd0ee139 | 186 | uint8_t buffer[9000]; |
cgraham | 0:d69efd0ee139 | 187 | int bufferSize = 0; |
cgraham | 0:d69efd0ee139 | 188 | char command; |
cgraham | 0:d69efd0ee139 | 189 | |
cgraham | 0:d69efd0ee139 | 190 | bool bluetooth_state; |
cgraham | 0:d69efd0ee139 | 191 | bool bluetooth_connected; |
cgraham | 0:d69efd0ee139 | 192 | bool NACK_received, ACK_received; |
cgraham | 0:d69efd0ee139 | 193 | bool start_sending_pic; |
cgraham | 0:d69efd0ee139 | 194 | bool Request_image; |
cgraham | 0:d69efd0ee139 | 195 | bool timer_started; |
cgraham | 0:d69efd0ee139 | 196 | Timer wait_timer, wait_ack_timer; |
cgraham | 0:d69efd0ee139 | 197 | |
cgraham | 0:d69efd0ee139 | 198 | int Wait_Time_pic; |
cgraham | 0:d69efd0ee139 | 199 | int cnt; |
cgraham | 0:d69efd0ee139 | 200 | |
cgraham | 0:d69efd0ee139 | 201 | |
cgraham | 0:d69efd0ee139 | 202 | |
cgraham | 0:d69efd0ee139 | 203 | //_____________________________________________________________________________________________ |
cgraham | 0:d69efd0ee139 | 204 | //Bluetooth Com functions |
cgraham | 0:d69efd0ee139 | 205 | |
cgraham | 0:d69efd0ee139 | 206 | bool wait_ack = false; |
cgraham | 0:d69efd0ee139 | 207 | |
cgraham | 0:d69efd0ee139 | 208 | |
cgraham | 0:d69efd0ee139 | 209 | void send_ack(bool x) |
cgraham | 0:d69efd0ee139 | 210 | { |
cgraham | 0:d69efd0ee139 | 211 | BaseMessage BaseMsg; |
cgraham | 0:d69efd0ee139 | 212 | //uint8_t outbuffer[1024]; |
cgraham | 0:d69efd0ee139 | 213 | |
cgraham | 0:d69efd0ee139 | 214 | |
cgraham | 0:d69efd0ee139 | 215 | pb_ostream_t outStream = pb_ostream_from_buffer(buffer, sizeof(buffer)); |
cgraham | 0:d69efd0ee139 | 216 | |
cgraham | 0:d69efd0ee139 | 217 | BaseMsg.ack.ok = x; |
cgraham | 0:d69efd0ee139 | 218 | BaseMsg.has_ack = true; |
cgraham | 0:d69efd0ee139 | 219 | BaseMsg.has_preferences = false; |
cgraham | 0:d69efd0ee139 | 220 | BaseMsg.has_images = false; |
cgraham | 0:d69efd0ee139 | 221 | BaseMsg.has_time = false; |
cgraham | 0:d69efd0ee139 | 222 | BaseMsg.has_request = false; |
cgraham | 0:d69efd0ee139 | 223 | BaseMsg.has_packet = false; |
cgraham | 0:d69efd0ee139 | 224 | |
cgraham | 0:d69efd0ee139 | 225 | int status = pb_encode(&outStream, BaseMessage_fields, &BaseMsg); |
cgraham | 0:d69efd0ee139 | 226 | uint8_t message_length = outStream.bytes_written; |
cgraham | 0:d69efd0ee139 | 227 | pc.printf("sending ack %d. Size:%d\r\n", x, message_length); |
cgraham | 0:d69efd0ee139 | 228 | pc.printf("\r\n"); |
cgraham | 0:d69efd0ee139 | 229 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 230 | { |
cgraham | 0:d69efd0ee139 | 231 | pc.printf("%u,",buffer[i]); |
cgraham | 0:d69efd0ee139 | 232 | } |
cgraham | 0:d69efd0ee139 | 233 | pc.printf("\r\n"); |
cgraham | 0:d69efd0ee139 | 234 | if(status) |
cgraham | 0:d69efd0ee139 | 235 | { |
cgraham | 0:d69efd0ee139 | 236 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 237 | { |
cgraham | 0:d69efd0ee139 | 238 | bluetooth.putc(buffer[i]); |
cgraham | 0:d69efd0ee139 | 239 | wait_ms(1); |
cgraham | 0:d69efd0ee139 | 240 | } |
cgraham | 0:d69efd0ee139 | 241 | } |
cgraham | 0:d69efd0ee139 | 242 | else |
cgraham | 0:d69efd0ee139 | 243 | { |
cgraham | 0:d69efd0ee139 | 244 | pc.printf("failed to send ack\r\n"); |
cgraham | 0:d69efd0ee139 | 245 | } |
cgraham | 0:d69efd0ee139 | 246 | } |
cgraham | 0:d69efd0ee139 | 247 | |
cgraham | 0:d69efd0ee139 | 248 | |
cgraham | 0:d69efd0ee139 | 249 | bool decode_message() |
cgraham | 0:d69efd0ee139 | 250 | { |
cgraham | 0:d69efd0ee139 | 251 | |
cgraham | 0:d69efd0ee139 | 252 | pb_istream_t inStream; |
cgraham | 0:d69efd0ee139 | 253 | BaseMessage baseMsg; |
cgraham | 0:d69efd0ee139 | 254 | bool result = false; |
cgraham | 0:d69efd0ee139 | 255 | |
cgraham | 0:d69efd0ee139 | 256 | while(bluetooth.readable()) |
cgraham | 0:d69efd0ee139 | 257 | { |
cgraham | 0:d69efd0ee139 | 258 | buffer[bufferSize] = bluetooth.getc(); |
cgraham | 0:d69efd0ee139 | 259 | bufferSize++; |
cgraham | 0:d69efd0ee139 | 260 | wait_us(80); |
cgraham | 0:d69efd0ee139 | 261 | } |
cgraham | 0:d69efd0ee139 | 262 | int i = 0; |
cgraham | 0:d69efd0ee139 | 263 | while(i < bufferSize) |
cgraham | 0:d69efd0ee139 | 264 | { |
cgraham | 0:d69efd0ee139 | 265 | pc.putc(buffer[i]); |
cgraham | 0:d69efd0ee139 | 266 | i++; |
cgraham | 0:d69efd0ee139 | 267 | } |
cgraham | 0:d69efd0ee139 | 268 | pc.printf("\r\n"); |
cgraham | 0:d69efd0ee139 | 269 | i = 0; |
cgraham | 0:d69efd0ee139 | 270 | while(i< bufferSize) |
cgraham | 0:d69efd0ee139 | 271 | { |
cgraham | 0:d69efd0ee139 | 272 | pc.printf("%d,", buffer[i]); |
cgraham | 0:d69efd0ee139 | 273 | i++; |
cgraham | 0:d69efd0ee139 | 274 | } |
cgraham | 0:d69efd0ee139 | 275 | |
cgraham | 0:d69efd0ee139 | 276 | pc.printf("\r\nbyte size receive %d\r\n", bufferSize); |
cgraham | 0:d69efd0ee139 | 277 | |
cgraham | 0:d69efd0ee139 | 278 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 279 | if (bufferSize > 0) |
cgraham | 0:d69efd0ee139 | 280 | { |
cgraham | 0:d69efd0ee139 | 281 | inStream = pb_istream_from_buffer(buffer, bufferSize); |
cgraham | 0:d69efd0ee139 | 282 | int status = pb_decode(&inStream, BaseMessage_fields, &baseMsg); |
cgraham | 0:d69efd0ee139 | 283 | |
cgraham | 0:d69efd0ee139 | 284 | if (status) |
cgraham | 0:d69efd0ee139 | 285 | { |
cgraham | 0:d69efd0ee139 | 286 | bufferSize = 0; |
cgraham | 0:d69efd0ee139 | 287 | if((baseMsg.messageType == BaseMessage_MessageType_Ack) && baseMsg.has_ack)//receive Ack |
cgraham | 0:d69efd0ee139 | 288 | { |
cgraham | 0:d69efd0ee139 | 289 | pc.printf("ACK message type.\r\n"); |
cgraham | 0:d69efd0ee139 | 290 | |
cgraham | 0:d69efd0ee139 | 291 | Ack ackMessage = baseMsg.ack; |
cgraham | 0:d69efd0ee139 | 292 | pc.printf("has_ack is %d and ack value is %d and %d\r\n", baseMsg.has_ack, baseMsg.ack.ok, ackMessage.ok); |
cgraham | 0:d69efd0ee139 | 293 | if (ackMessage.ok) |
cgraham | 0:d69efd0ee139 | 294 | { |
cgraham | 0:d69efd0ee139 | 295 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 296 | wait_ack_timer.stop(); |
cgraham | 0:d69efd0ee139 | 297 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 298 | result = true; //able to decode ack and remove queue |
cgraham | 0:d69efd0ee139 | 299 | ACK_received = true; |
cgraham | 0:d69efd0ee139 | 300 | |
cgraham | 0:d69efd0ee139 | 301 | } |
cgraham | 0:d69efd0ee139 | 302 | else |
cgraham | 0:d69efd0ee139 | 303 | { |
cgraham | 0:d69efd0ee139 | 304 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 305 | NACK_received = true; |
cgraham | 0:d69efd0ee139 | 306 | result = true; //NACK received but effectively decoded message |
cgraham | 0:d69efd0ee139 | 307 | } |
cgraham | 0:d69efd0ee139 | 308 | } |
cgraham | 0:d69efd0ee139 | 309 | |
cgraham | 0:d69efd0ee139 | 310 | else if(baseMsg.messageType == BaseMessage_MessageType_Preferences)//setting change |
cgraham | 0:d69efd0ee139 | 311 | { |
cgraham | 0:d69efd0ee139 | 312 | pc.printf("Preference message type.\r\n"); |
cgraham | 0:d69efd0ee139 | 313 | if(baseMsg.has_preferences) |
cgraham | 0:d69efd0ee139 | 314 | { |
cgraham | 0:d69efd0ee139 | 315 | Wait_Time_pic = baseMsg.preferences.timeInterval; |
cgraham | 0:d69efd0ee139 | 316 | FILE* fp; |
cgraham | 0:d69efd0ee139 | 317 | fp = fopen(Setting, "w"); |
cgraham | 0:d69efd0ee139 | 318 | fprintf(fp, "%d\r\n", cnt); |
cgraham | 0:d69efd0ee139 | 319 | fprintf(fp, "%d", Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 320 | fclose(fp); |
cgraham | 0:d69efd0ee139 | 321 | pc.printf("wait time changed to %d", Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 322 | |
cgraham | 0:d69efd0ee139 | 323 | } |
cgraham | 0:d69efd0ee139 | 324 | result = true; |
cgraham | 0:d69efd0ee139 | 325 | send_ack(true); |
cgraham | 0:d69efd0ee139 | 326 | } |
cgraham | 0:d69efd0ee139 | 327 | else if(baseMsg.messageType == BaseMessage_MessageType_RequestImages) |
cgraham | 0:d69efd0ee139 | 328 | { |
cgraham | 0:d69efd0ee139 | 329 | pc.printf("Request Images message type.\r\n"); |
cgraham | 0:d69efd0ee139 | 330 | pc.printf("has_request is %d\r\n", baseMsg.has_request); |
cgraham | 0:d69efd0ee139 | 331 | pc.printf("baseMsg.request.request is %d\r\n", baseMsg.request.request); |
cgraham | 0:d69efd0ee139 | 332 | if(baseMsg.has_request) |
cgraham | 0:d69efd0ee139 | 333 | { |
cgraham | 0:d69efd0ee139 | 334 | if(baseMsg.request.request) |
cgraham | 0:d69efd0ee139 | 335 | { |
cgraham | 0:d69efd0ee139 | 336 | send_ack(true); |
cgraham | 0:d69efd0ee139 | 337 | Request_image = true; |
cgraham | 0:d69efd0ee139 | 338 | } |
cgraham | 0:d69efd0ee139 | 339 | } |
cgraham | 0:d69efd0ee139 | 340 | result = true; |
cgraham | 0:d69efd0ee139 | 341 | } |
cgraham | 0:d69efd0ee139 | 342 | } |
cgraham | 0:d69efd0ee139 | 343 | else |
cgraham | 0:d69efd0ee139 | 344 | { |
cgraham | 0:d69efd0ee139 | 345 | char* stringcomp = strstr((char *)buffer, "RING"); |
cgraham | 0:d69efd0ee139 | 346 | char* stringcomp2 = strstr((char *)buffer, "RFCOMM"); |
cgraham | 0:d69efd0ee139 | 347 | char* stringcomp3 = strstr((char *)buffer, "NO CARRIER"); |
cgraham | 0:d69efd0ee139 | 348 | char* stringcomp4 = strstr((char *)buffer, "SET BT NAME"); |
cgraham | 0:d69efd0ee139 | 349 | char* stringcomp5 = strstr((char *)buffer, "INQUIRY"); |
cgraham | 0:d69efd0ee139 | 350 | |
cgraham | 0:d69efd0ee139 | 351 | if(stringcomp != NULL && stringcomp2 !=NULL) |
cgraham | 0:d69efd0ee139 | 352 | { |
cgraham | 0:d69efd0ee139 | 353 | bluetooth_connected = true; |
cgraham | 0:d69efd0ee139 | 354 | pc.printf("Bluetooth has connection\r\n"); |
cgraham | 0:d69efd0ee139 | 355 | |
cgraham | 0:d69efd0ee139 | 356 | } |
cgraham | 0:d69efd0ee139 | 357 | else if(stringcomp3 != NULL) |
cgraham | 0:d69efd0ee139 | 358 | { |
cgraham | 0:d69efd0ee139 | 359 | bluetooth_connected = false; |
cgraham | 0:d69efd0ee139 | 360 | pc.printf("Bluetooth not connected\r\n"); |
cgraham | 0:d69efd0ee139 | 361 | } |
cgraham | 0:d69efd0ee139 | 362 | else if ((stringcomp4 != NULL) && (stringcomp5 != NULL)) |
cgraham | 0:d69efd0ee139 | 363 | { |
cgraham | 0:d69efd0ee139 | 364 | |
cgraham | 0:d69efd0ee139 | 365 | } |
cgraham | 0:d69efd0ee139 | 366 | else |
cgraham | 0:d69efd0ee139 | 367 | { |
cgraham | 0:d69efd0ee139 | 368 | pc.printf("Failed to decode message.\r\n"); |
cgraham | 0:d69efd0ee139 | 369 | send_ack(false); |
cgraham | 0:d69efd0ee139 | 370 | } |
cgraham | 0:d69efd0ee139 | 371 | |
cgraham | 0:d69efd0ee139 | 372 | bufferSize = 0; |
cgraham | 0:d69efd0ee139 | 373 | result = false; |
cgraham | 0:d69efd0ee139 | 374 | } |
cgraham | 0:d69efd0ee139 | 375 | } |
cgraham | 0:d69efd0ee139 | 376 | |
cgraham | 0:d69efd0ee139 | 377 | return result; //false only when NACK or not able to decode |
cgraham | 0:d69efd0ee139 | 378 | } |
cgraham | 0:d69efd0ee139 | 379 | |
cgraham | 0:d69efd0ee139 | 380 | int GetFileSize(char fname[64]) |
cgraham | 0:d69efd0ee139 | 381 | { |
cgraham | 0:d69efd0ee139 | 382 | int size; |
cgraham | 0:d69efd0ee139 | 383 | |
cgraham | 0:d69efd0ee139 | 384 | FILE* pFile = fopen (fname,"rb"); |
cgraham | 0:d69efd0ee139 | 385 | if (pFile==NULL) |
cgraham | 0:d69efd0ee139 | 386 | { |
cgraham | 0:d69efd0ee139 | 387 | size = -1; |
cgraham | 0:d69efd0ee139 | 388 | pc.printf("Error opening file"); |
cgraham | 0:d69efd0ee139 | 389 | } |
cgraham | 0:d69efd0ee139 | 390 | else |
cgraham | 0:d69efd0ee139 | 391 | { |
cgraham | 0:d69efd0ee139 | 392 | fseek (pFile, 0, SEEK_END); // non-portable |
cgraham | 0:d69efd0ee139 | 393 | size=ftell (pFile); |
cgraham | 0:d69efd0ee139 | 394 | fclose (pFile); |
cgraham | 0:d69efd0ee139 | 395 | printf ("Size of myfile.txt: %ld bytes.\n",size); |
cgraham | 0:d69efd0ee139 | 396 | } |
cgraham | 0:d69efd0ee139 | 397 | return size; |
cgraham | 0:d69efd0ee139 | 398 | } |
cgraham | 0:d69efd0ee139 | 399 | |
cgraham | 0:d69efd0ee139 | 400 | bool first_pic_started, second_pic_started; |
cgraham | 0:d69efd0ee139 | 401 | bool first_pic_completed, second_pic_completed; |
cgraham | 0:d69efd0ee139 | 402 | bool init_first_pic, init_second_pic; |
cgraham | 0:d69efd0ee139 | 403 | int num_of_packets; |
cgraham | 0:d69efd0ee139 | 404 | |
cgraham | 0:d69efd0ee139 | 405 | //send the number of packet to expect |
cgraham | 0:d69efd0ee139 | 406 | //then send the first packet after ACK (about 7 packet) |
cgraham | 0:d69efd0ee139 | 407 | //false means fail to encode |
cgraham | 0:d69efd0ee139 | 408 | bool send_pic(int index) |
cgraham | 0:d69efd0ee139 | 409 | { |
cgraham | 0:d69efd0ee139 | 410 | BaseMessage BaseMsg; |
cgraham | 0:d69efd0ee139 | 411 | char fname[64]; |
cgraham | 0:d69efd0ee139 | 412 | int size; |
cgraham | 0:d69efd0ee139 | 413 | |
cgraham | 0:d69efd0ee139 | 414 | //FILE *fp; |
cgraham | 0:d69efd0ee139 | 415 | |
cgraham | 0:d69efd0ee139 | 416 | if (cnt > 0) //# of pic taken |
cgraham | 0:d69efd0ee139 | 417 | { |
cgraham | 0:d69efd0ee139 | 418 | if(index == 1)//first file |
cgraham | 0:d69efd0ee139 | 419 | { |
cgraham | 0:d69efd0ee139 | 420 | //get filesize |
cgraham | 0:d69efd0ee139 | 421 | snprintf(fname, sizeof(fname) - 1, FILENAME, cnt - 1); |
cgraham | 0:d69efd0ee139 | 422 | init_first_pic = true; |
cgraham | 0:d69efd0ee139 | 423 | } |
cgraham | 0:d69efd0ee139 | 424 | else |
cgraham | 0:d69efd0ee139 | 425 | { |
cgraham | 0:d69efd0ee139 | 426 | snprintf(fname, sizeof(fname) - 1, FILENAME2, cnt - 1); |
cgraham | 0:d69efd0ee139 | 427 | init_second_pic = true; |
cgraham | 0:d69efd0ee139 | 428 | } |
cgraham | 0:d69efd0ee139 | 429 | |
cgraham | 0:d69efd0ee139 | 430 | size = GetFileSize(fname); |
cgraham | 0:d69efd0ee139 | 431 | |
cgraham | 0:d69efd0ee139 | 432 | if(size == -1) |
cgraham | 0:d69efd0ee139 | 433 | { |
cgraham | 0:d69efd0ee139 | 434 | pc.printf("Error getting size (%d) of File. File cnt: %d \r\n", size, cnt); |
cgraham | 0:d69efd0ee139 | 435 | //ERROR |
cgraham | 0:d69efd0ee139 | 436 | init_first_pic = false; |
cgraham | 0:d69efd0ee139 | 437 | init_second_pic = false; |
cgraham | 0:d69efd0ee139 | 438 | return false; |
cgraham | 0:d69efd0ee139 | 439 | } |
cgraham | 0:d69efd0ee139 | 440 | else |
cgraham | 0:d69efd0ee139 | 441 | { |
cgraham | 0:d69efd0ee139 | 442 | pb_ostream_t outStream = pb_ostream_from_buffer(buffer, sizeof(buffer)); |
cgraham | 0:d69efd0ee139 | 443 | BaseMsg.messageType = BaseMessage_MessageType_Images; |
cgraham | 0:d69efd0ee139 | 444 | BaseMsg.has_images = true; |
cgraham | 0:d69efd0ee139 | 445 | BaseMsg.has_time = false; |
cgraham | 0:d69efd0ee139 | 446 | BaseMsg.has_packet = false; |
cgraham | 0:d69efd0ee139 | 447 | BaseMsg.has_preferences = false; |
cgraham | 0:d69efd0ee139 | 448 | BaseMsg.has_ack = false; |
cgraham | 0:d69efd0ee139 | 449 | BaseMsg.has_request = false; |
cgraham | 0:d69efd0ee139 | 450 | if(index == 1) |
cgraham | 0:d69efd0ee139 | 451 | { |
cgraham | 0:d69efd0ee139 | 452 | BaseMsg.images.isFirstImage = true; |
cgraham | 0:d69efd0ee139 | 453 | } |
cgraham | 0:d69efd0ee139 | 454 | else |
cgraham | 0:d69efd0ee139 | 455 | { |
cgraham | 0:d69efd0ee139 | 456 | BaseMsg.images.isFirstImage = false; |
cgraham | 0:d69efd0ee139 | 457 | } |
cgraham | 0:d69efd0ee139 | 458 | BaseMsg.images.fileSize = size; |
cgraham | 0:d69efd0ee139 | 459 | num_of_packets = ceil((float)(size/8192)); |
cgraham | 0:d69efd0ee139 | 460 | BaseMsg.images.numberOfPackets = num_of_packets; |
cgraham | 0:d69efd0ee139 | 461 | int status = pb_encode(&outStream, BaseMessage_fields, &BaseMsg); |
cgraham | 0:d69efd0ee139 | 462 | uint8_t message_length = outStream.bytes_written; |
cgraham | 0:d69efd0ee139 | 463 | pc.printf("Sending image info. File size: %d, num of packet: %d, isFirstimage: %d\r\n", size, num_of_packets, BaseMsg.images.isFirstImage); |
cgraham | 0:d69efd0ee139 | 464 | if (status) |
cgraham | 0:d69efd0ee139 | 465 | { |
cgraham | 0:d69efd0ee139 | 466 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 467 | { |
cgraham | 0:d69efd0ee139 | 468 | bluetooth.putc(buffer[i]); |
cgraham | 0:d69efd0ee139 | 469 | wait_ms(1); |
cgraham | 0:d69efd0ee139 | 470 | } |
cgraham | 0:d69efd0ee139 | 471 | wait_ack = true; |
cgraham | 0:d69efd0ee139 | 472 | NACK_received = false; |
cgraham | 0:d69efd0ee139 | 473 | ACK_received = false; |
cgraham | 0:d69efd0ee139 | 474 | start_sending_pic = true; |
cgraham | 0:d69efd0ee139 | 475 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 476 | wait_ack_timer.start(); |
cgraham | 0:d69efd0ee139 | 477 | return true; |
cgraham | 0:d69efd0ee139 | 478 | } |
cgraham | 0:d69efd0ee139 | 479 | else //failed to encode |
cgraham | 0:d69efd0ee139 | 480 | { |
cgraham | 0:d69efd0ee139 | 481 | pc.printf("failed to encode message to send out of bluetooth\r\n"); |
cgraham | 0:d69efd0ee139 | 482 | |
cgraham | 0:d69efd0ee139 | 483 | return false; |
cgraham | 0:d69efd0ee139 | 484 | } |
cgraham | 0:d69efd0ee139 | 485 | } |
cgraham | 0:d69efd0ee139 | 486 | } |
cgraham | 0:d69efd0ee139 | 487 | else |
cgraham | 0:d69efd0ee139 | 488 | { |
cgraham | 0:d69efd0ee139 | 489 | //init_first_pic = false; |
cgraham | 0:d69efd0ee139 | 490 | //init_second_pic = false; |
cgraham | 0:d69efd0ee139 | 491 | pb_ostream_t outStream = pb_ostream_from_buffer(buffer, sizeof(buffer)); |
cgraham | 0:d69efd0ee139 | 492 | BaseMsg.messageType = BaseMessage_MessageType_Time; |
cgraham | 0:d69efd0ee139 | 493 | BaseMsg.has_images = false; |
cgraham | 0:d69efd0ee139 | 494 | BaseMsg.has_time = true; |
cgraham | 0:d69efd0ee139 | 495 | if(timer_started) |
cgraham | 0:d69efd0ee139 | 496 | { |
cgraham | 0:d69efd0ee139 | 497 | BaseMsg.time.remainingTime = Wait_Time_pic - wait_timer.read(); |
cgraham | 0:d69efd0ee139 | 498 | } |
cgraham | 0:d69efd0ee139 | 499 | else |
cgraham | 0:d69efd0ee139 | 500 | { |
cgraham | 0:d69efd0ee139 | 501 | BaseMsg.time.remainingTime = -1; |
cgraham | 0:d69efd0ee139 | 502 | } |
cgraham | 0:d69efd0ee139 | 503 | BaseMsg.has_ack = false; |
cgraham | 0:d69efd0ee139 | 504 | BaseMsg.has_preferences = false; |
cgraham | 0:d69efd0ee139 | 505 | BaseMsg.has_packet = false; |
cgraham | 0:d69efd0ee139 | 506 | BaseMsg.has_request = false; |
cgraham | 0:d69efd0ee139 | 507 | |
cgraham | 0:d69efd0ee139 | 508 | int status = pb_encode(&outStream, BaseMessage_fields, &BaseMsg); |
cgraham | 0:d69efd0ee139 | 509 | uint8_t message_length = outStream.bytes_written; |
cgraham | 0:d69efd0ee139 | 510 | pc.printf("sending remaining time: %d. hex: %x. Size:%d\r\n", BaseMsg.time.remainingTime, BaseMsg.time.remainingTime, message_length); |
cgraham | 0:d69efd0ee139 | 511 | pc.printf("\r\n"); |
cgraham | 0:d69efd0ee139 | 512 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 513 | { |
cgraham | 0:d69efd0ee139 | 514 | pc.printf("%u,",buffer[i]); |
cgraham | 0:d69efd0ee139 | 515 | } |
cgraham | 0:d69efd0ee139 | 516 | pc.printf("\r\n"); |
cgraham | 0:d69efd0ee139 | 517 | if (status) |
cgraham | 0:d69efd0ee139 | 518 | { |
cgraham | 0:d69efd0ee139 | 519 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 520 | { |
cgraham | 0:d69efd0ee139 | 521 | bluetooth.putc(buffer[i]); |
cgraham | 0:d69efd0ee139 | 522 | wait_ms(1); |
cgraham | 0:d69efd0ee139 | 523 | } |
cgraham | 0:d69efd0ee139 | 524 | wait_ack = true; |
cgraham | 0:d69efd0ee139 | 525 | NACK_received = false; |
cgraham | 0:d69efd0ee139 | 526 | ACK_received = false; |
cgraham | 0:d69efd0ee139 | 527 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 528 | wait_ack_timer.start(); |
cgraham | 0:d69efd0ee139 | 529 | return true; |
cgraham | 0:d69efd0ee139 | 530 | } |
cgraham | 0:d69efd0ee139 | 531 | else //failed to encode |
cgraham | 0:d69efd0ee139 | 532 | { |
cgraham | 0:d69efd0ee139 | 533 | pc.printf("failed to encode message to send out of bluetooth\r\n"); |
cgraham | 0:d69efd0ee139 | 534 | |
cgraham | 0:d69efd0ee139 | 535 | return false; |
cgraham | 0:d69efd0ee139 | 536 | } |
cgraham | 0:d69efd0ee139 | 537 | |
cgraham | 0:d69efd0ee139 | 538 | } |
cgraham | 0:d69efd0ee139 | 539 | |
cgraham | 0:d69efd0ee139 | 540 | } |
cgraham | 0:d69efd0ee139 | 541 | |
cgraham | 0:d69efd0ee139 | 542 | bool send_packet(int file_index, int packet_index) |
cgraham | 0:d69efd0ee139 | 543 | { |
cgraham | 0:d69efd0ee139 | 544 | char fname[64]; |
cgraham | 0:d69efd0ee139 | 545 | BaseMessage BaseMsg; |
cgraham | 0:d69efd0ee139 | 546 | int packet_buf[8192]; |
cgraham | 0:d69efd0ee139 | 547 | size_t packet_size; |
cgraham | 0:d69efd0ee139 | 548 | |
cgraham | 0:d69efd0ee139 | 549 | if(file_index == 1)//first file |
cgraham | 0:d69efd0ee139 | 550 | { |
cgraham | 0:d69efd0ee139 | 551 | //get filesize |
cgraham | 0:d69efd0ee139 | 552 | snprintf(fname, sizeof(fname) - 1, FILENAME, cnt - 1); |
cgraham | 0:d69efd0ee139 | 553 | |
cgraham | 0:d69efd0ee139 | 554 | } |
cgraham | 0:d69efd0ee139 | 555 | else |
cgraham | 0:d69efd0ee139 | 556 | { |
cgraham | 0:d69efd0ee139 | 557 | snprintf(fname, sizeof(fname) - 1, FILENAME2, cnt - 1); |
cgraham | 0:d69efd0ee139 | 558 | } |
cgraham | 0:d69efd0ee139 | 559 | |
cgraham | 0:d69efd0ee139 | 560 | pb_ostream_t outStream = pb_ostream_from_buffer(buffer, sizeof(buffer)); |
cgraham | 0:d69efd0ee139 | 561 | BaseMsg.messageType = BaseMessage_MessageType_ImagePacket; |
cgraham | 0:d69efd0ee139 | 562 | BaseMsg.has_images = false; |
cgraham | 0:d69efd0ee139 | 563 | BaseMsg.has_time = false; |
cgraham | 0:d69efd0ee139 | 564 | BaseMsg.has_ack = false; |
cgraham | 0:d69efd0ee139 | 565 | BaseMsg.has_preferences = false; |
cgraham | 0:d69efd0ee139 | 566 | BaseMsg.has_packet = true; |
cgraham | 0:d69efd0ee139 | 567 | BaseMsg.has_request = false; |
cgraham | 0:d69efd0ee139 | 568 | //seek file location to send next 8K packet |
cgraham | 0:d69efd0ee139 | 569 | FILE* fp = fopen (fname,"rb"); |
cgraham | 0:d69efd0ee139 | 570 | packet_size = 0; |
cgraham | 0:d69efd0ee139 | 571 | if(fp != NULL) |
cgraham | 0:d69efd0ee139 | 572 | { |
cgraham | 0:d69efd0ee139 | 573 | //seek file location to read |
cgraham | 0:d69efd0ee139 | 574 | fseek(fp, (packet_index * 8192),SEEK_SET); |
cgraham | 0:d69efd0ee139 | 575 | |
cgraham | 0:d69efd0ee139 | 576 | //read and fill buffer, increment packet size; |
cgraham | 0:d69efd0ee139 | 577 | do |
cgraham | 0:d69efd0ee139 | 578 | { |
cgraham | 0:d69efd0ee139 | 579 | packet_buf[packet_size] = fgetc(fp); |
cgraham | 0:d69efd0ee139 | 580 | packet_size++; |
cgraham | 0:d69efd0ee139 | 581 | } while((packet_size < 8192) && (packet_buf[packet_size - 1] != EOF)); |
cgraham | 0:d69efd0ee139 | 582 | } |
cgraham | 0:d69efd0ee139 | 583 | BaseMsg.packet.packetNumber = packet_index; |
cgraham | 0:d69efd0ee139 | 584 | BaseMsg.packet.image.size = packet_size; |
cgraham | 0:d69efd0ee139 | 585 | for(int i = 0; i < packet_size; i++) |
cgraham | 0:d69efd0ee139 | 586 | { |
cgraham | 0:d69efd0ee139 | 587 | BaseMsg.packet.image.bytes[i] = packet_buf[i]; |
cgraham | 0:d69efd0ee139 | 588 | } |
cgraham | 0:d69efd0ee139 | 589 | int status = pb_encode(&outStream, BaseMessage_fields, &BaseMsg); |
cgraham | 0:d69efd0ee139 | 590 | uint8_t message_length = outStream.bytes_written; |
cgraham | 0:d69efd0ee139 | 591 | pc.printf("sending packet #%d. Size:%d\r\n", packet_index, message_length); |
cgraham | 0:d69efd0ee139 | 592 | if(status) |
cgraham | 0:d69efd0ee139 | 593 | { |
cgraham | 0:d69efd0ee139 | 594 | for(int i = 0; i < message_length; i++) |
cgraham | 0:d69efd0ee139 | 595 | { |
cgraham | 0:d69efd0ee139 | 596 | bluetooth.putc(buffer[i]); |
cgraham | 0:d69efd0ee139 | 597 | wait_ms(1); |
cgraham | 0:d69efd0ee139 | 598 | } |
cgraham | 0:d69efd0ee139 | 599 | wait_ack = true; |
cgraham | 0:d69efd0ee139 | 600 | NACK_received = false; |
cgraham | 0:d69efd0ee139 | 601 | ACK_received = false; |
cgraham | 0:d69efd0ee139 | 602 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 603 | wait_ack_timer.start(); |
cgraham | 0:d69efd0ee139 | 604 | return true; |
cgraham | 0:d69efd0ee139 | 605 | } |
cgraham | 0:d69efd0ee139 | 606 | else //failed to encode |
cgraham | 0:d69efd0ee139 | 607 | { |
cgraham | 0:d69efd0ee139 | 608 | pc.printf("failed to encode message to send out of bluetooth\r\n"); |
cgraham | 0:d69efd0ee139 | 609 | |
cgraham | 0:d69efd0ee139 | 610 | return false; |
cgraham | 0:d69efd0ee139 | 611 | } |
cgraham | 0:d69efd0ee139 | 612 | |
cgraham | 0:d69efd0ee139 | 613 | } |
cgraham | 0:d69efd0ee139 | 614 | |
cgraham | 0:d69efd0ee139 | 615 | bool Camera_init(bool camera_pwr) |
cgraham | 0:d69efd0ee139 | 616 | { |
cgraham | 0:d69efd0ee139 | 617 | bool result; |
cgraham | 0:d69efd0ee139 | 618 | |
cgraham | 0:d69efd0ee139 | 619 | if(camera_pwr == ON) |
cgraham | 0:d69efd0ee139 | 620 | { |
cgraham | 0:d69efd0ee139 | 621 | Camera_power = 1; |
cgraham | 0:d69efd0ee139 | 622 | led_illuminate = 1; |
cgraham | 0:d69efd0ee139 | 623 | |
cgraham | 0:d69efd0ee139 | 624 | DEBMSG("Camera module"); |
cgraham | 0:d69efd0ee139 | 625 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 626 | DEBMSG("Resetting..."); |
cgraham | 0:d69efd0ee139 | 627 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 628 | |
cgraham | 0:d69efd0ee139 | 629 | result = false; |
cgraham | 0:d69efd0ee139 | 630 | |
cgraham | 0:d69efd0ee139 | 631 | wait(3); |
cgraham | 0:d69efd0ee139 | 632 | |
cgraham | 0:d69efd0ee139 | 633 | if (cam1.reset() == 0) |
cgraham | 0:d69efd0ee139 | 634 | { |
cgraham | 0:d69efd0ee139 | 635 | DEBMSG("Reset OK."); |
cgraham | 0:d69efd0ee139 | 636 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 637 | if(cam1.setImageSize(cam1.ImageSize640x480) == 0) |
cgraham | 0:d69efd0ee139 | 638 | { |
cgraham | 0:d69efd0ee139 | 639 | DEBMSG("Image Size OK."); |
cgraham | 0:d69efd0ee139 | 640 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 641 | result = true; |
cgraham | 0:d69efd0ee139 | 642 | } |
cgraham | 0:d69efd0ee139 | 643 | else |
cgraham | 0:d69efd0ee139 | 644 | { |
cgraham | 0:d69efd0ee139 | 645 | DEBMSG("Image Size Error."); |
cgraham | 0:d69efd0ee139 | 646 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 647 | } |
cgraham | 0:d69efd0ee139 | 648 | |
cgraham | 0:d69efd0ee139 | 649 | } |
cgraham | 0:d69efd0ee139 | 650 | else |
cgraham | 0:d69efd0ee139 | 651 | { |
cgraham | 0:d69efd0ee139 | 652 | DEBMSG("Reset fail."); |
cgraham | 0:d69efd0ee139 | 653 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 654 | //error("Reset fail."); |
cgraham | 0:d69efd0ee139 | 655 | } |
cgraham | 0:d69efd0ee139 | 656 | } |
cgraham | 0:d69efd0ee139 | 657 | else |
cgraham | 0:d69efd0ee139 | 658 | { |
cgraham | 0:d69efd0ee139 | 659 | Camera_power = 0; |
cgraham | 0:d69efd0ee139 | 660 | led_illuminate = 0; |
cgraham | 0:d69efd0ee139 | 661 | result = true; |
cgraham | 0:d69efd0ee139 | 662 | } |
cgraham | 0:d69efd0ee139 | 663 | |
cgraham | 0:d69efd0ee139 | 664 | return result; |
cgraham | 0:d69efd0ee139 | 665 | } |
cgraham | 0:d69efd0ee139 | 666 | |
cgraham | 0:d69efd0ee139 | 667 | void bluetooth_init() |
cgraham | 0:d69efd0ee139 | 668 | { |
cgraham | 0:d69efd0ee139 | 669 | |
cgraham | 0:d69efd0ee139 | 670 | bluetooth.baud(115200); |
cgraham | 0:d69efd0ee139 | 671 | //bluetooth.printf("AT\r\n"); |
cgraham | 0:d69efd0ee139 | 672 | bluetooth.printf("SET BT NAME COLOR_READER_02\r\n"); |
cgraham | 0:d69efd0ee139 | 673 | bluetooth.printf("INQUIRY 5\r\n"); |
cgraham | 0:d69efd0ee139 | 674 | |
cgraham | 0:d69efd0ee139 | 675 | } |
cgraham | 0:d69efd0ee139 | 676 | |
cgraham | 0:d69efd0ee139 | 677 | //_______________________________________________________________________________________ |
cgraham | 0:d69efd0ee139 | 678 | //power up load settings |
cgraham | 0:d69efd0ee139 | 679 | |
cgraham | 0:d69efd0ee139 | 680 | |
cgraham | 0:d69efd0ee139 | 681 | void load_setting(void) |
cgraham | 0:d69efd0ee139 | 682 | { |
cgraham | 0:d69efd0ee139 | 683 | FILE* fp; |
cgraham | 0:d69efd0ee139 | 684 | |
cgraham | 0:d69efd0ee139 | 685 | pc.printf("Loading Setting.....\r\n\r\n"); |
cgraham | 0:d69efd0ee139 | 686 | |
cgraham | 0:d69efd0ee139 | 687 | fp = fopen(Setting, "r"); |
cgraham | 0:d69efd0ee139 | 688 | if (fp != NULL) |
cgraham | 0:d69efd0ee139 | 689 | { |
cgraham | 0:d69efd0ee139 | 690 | fscanf(fp, "%d%d", &cnt, &Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 691 | //fscanf(fp, "%d", &Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 692 | fclose(fp); |
cgraham | 0:d69efd0ee139 | 693 | } |
cgraham | 0:d69efd0ee139 | 694 | else |
cgraham | 0:d69efd0ee139 | 695 | { |
cgraham | 0:d69efd0ee139 | 696 | cnt = 0; |
cgraham | 0:d69efd0ee139 | 697 | Wait_Time_pic = 10; //10 sec. for debug |
cgraham | 0:d69efd0ee139 | 698 | } |
cgraham | 0:d69efd0ee139 | 699 | |
cgraham | 0:d69efd0ee139 | 700 | pc.printf("Wait time for pic is %d.\r\n", Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 701 | pc.printf("File index is %d.\r\n\r\n", cnt); |
cgraham | 0:d69efd0ee139 | 702 | |
cgraham | 0:d69efd0ee139 | 703 | } |
cgraham | 0:d69efd0ee139 | 704 | |
cgraham | 0:d69efd0ee139 | 705 | |
cgraham | 0:d69efd0ee139 | 706 | |
cgraham | 0:d69efd0ee139 | 707 | void delete_file(char fname[64]) |
cgraham | 0:d69efd0ee139 | 708 | { |
cgraham | 0:d69efd0ee139 | 709 | //snprintf(fname, sizeof(fname) - 1, FILENAME, index-10); |
cgraham | 0:d69efd0ee139 | 710 | remove(fname); |
cgraham | 0:d69efd0ee139 | 711 | } |
cgraham | 0:d69efd0ee139 | 712 | |
cgraham | 0:d69efd0ee139 | 713 | |
cgraham | 0:d69efd0ee139 | 714 | //Take pic and store in memory |
cgraham | 0:d69efd0ee139 | 715 | //Need to get naming convention to link the image together(1st and 2nd) |
cgraham | 0:d69efd0ee139 | 716 | void take_pic(char fname[64]) |
cgraham | 0:d69efd0ee139 | 717 | { |
cgraham | 0:d69efd0ee139 | 718 | bool camera_work = Camera_init(ON); |
cgraham | 0:d69efd0ee139 | 719 | if(camera_work) |
cgraham | 0:d69efd0ee139 | 720 | { |
cgraham | 0:d69efd0ee139 | 721 | wait(8); |
cgraham | 0:d69efd0ee139 | 722 | int r = capture(&cam1, fname); |
cgraham | 0:d69efd0ee139 | 723 | if (r == 0) { |
cgraham | 0:d69efd0ee139 | 724 | DEBMSG("[%04d]:OK.", cnt); |
cgraham | 0:d69efd0ee139 | 725 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 726 | //command = 'd'; |
cgraham | 0:d69efd0ee139 | 727 | } |
cgraham | 0:d69efd0ee139 | 728 | else |
cgraham | 0:d69efd0ee139 | 729 | { |
cgraham | 0:d69efd0ee139 | 730 | DEBMSG("[%04d]:NG. (code=%d)", cnt, r); |
cgraham | 0:d69efd0ee139 | 731 | NEWLINE(); |
cgraham | 0:d69efd0ee139 | 732 | //error("Failure."); |
cgraham | 0:d69efd0ee139 | 733 | //command = ' '; |
cgraham | 0:d69efd0ee139 | 734 | //mode = 98; |
cgraham | 0:d69efd0ee139 | 735 | //change_mode_screen(mode); |
cgraham | 0:d69efd0ee139 | 736 | } |
cgraham | 0:d69efd0ee139 | 737 | |
cgraham | 0:d69efd0ee139 | 738 | camera_work = Camera_init(OFF); |
cgraham | 0:d69efd0ee139 | 739 | |
cgraham | 0:d69efd0ee139 | 740 | } |
cgraham | 0:d69efd0ee139 | 741 | } |
cgraham | 0:d69efd0ee139 | 742 | |
cgraham | 0:d69efd0ee139 | 743 | void Init(void) |
cgraham | 0:d69efd0ee139 | 744 | { |
cgraham | 0:d69efd0ee139 | 745 | timer_started = false; |
cgraham | 0:d69efd0ee139 | 746 | Request_image = false; |
cgraham | 0:d69efd0ee139 | 747 | init_first_pic = false; |
cgraham | 0:d69efd0ee139 | 748 | init_second_pic = false; |
cgraham | 0:d69efd0ee139 | 749 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 750 | second_pic_started = false; |
cgraham | 0:d69efd0ee139 | 751 | first_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 752 | second_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 753 | start_sending_pic = false; |
cgraham | 0:d69efd0ee139 | 754 | |
cgraham | 0:d69efd0ee139 | 755 | NACK_received = false; |
cgraham | 0:d69efd0ee139 | 756 | ACK_received = false; |
cgraham | 0:d69efd0ee139 | 757 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 758 | Start.mode(PullUp); |
cgraham | 0:d69efd0ee139 | 759 | Camera_power = 0; |
cgraham | 0:d69efd0ee139 | 760 | wait_timer.stop(); |
cgraham | 0:d69efd0ee139 | 761 | wait_timer.reset(); |
cgraham | 0:d69efd0ee139 | 762 | wait_ack_timer.stop(); |
cgraham | 0:d69efd0ee139 | 763 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 764 | load_setting(); |
cgraham | 0:d69efd0ee139 | 765 | bluetooth_init(); |
cgraham | 0:d69efd0ee139 | 766 | } |
cgraham | 0:d69efd0ee139 | 767 | |
cgraham | 0:d69efd0ee139 | 768 | |
cgraham | 0:d69efd0ee139 | 769 | |
cgraham | 0:d69efd0ee139 | 770 | int main() { |
cgraham | 0:d69efd0ee139 | 771 | char fname[64]; |
cgraham | 0:d69efd0ee139 | 772 | |
cgraham | 0:d69efd0ee139 | 773 | bool result = false; |
cgraham | 0:d69efd0ee139 | 774 | //bool error_cap = false; |
cgraham | 0:d69efd0ee139 | 775 | bool test_ended = true; |
cgraham | 0:d69efd0ee139 | 776 | bool final_img = false; |
cgraham | 0:d69efd0ee139 | 777 | bool temp_result; |
cgraham | 0:d69efd0ee139 | 778 | int attempt = 0; |
cgraham | 0:d69efd0ee139 | 779 | FILE *fp; |
cgraham | 0:d69efd0ee139 | 780 | int packet_index = 0; |
cgraham | 0:d69efd0ee139 | 781 | |
cgraham | 0:d69efd0ee139 | 782 | |
cgraham | 0:d69efd0ee139 | 783 | pc.printf("******************Program Start Here (V2.0).....\n\n\r"); |
cgraham | 0:d69efd0ee139 | 784 | Init(); |
cgraham | 0:d69efd0ee139 | 785 | pc.printf("Initialized: Entering while loop.\r\n\r\n"); |
cgraham | 0:d69efd0ee139 | 786 | while (1) |
cgraham | 0:d69efd0ee139 | 787 | { |
cgraham | 0:d69efd0ee139 | 788 | //bluetooth income data --> feeds time to take second picture |
cgraham | 0:d69efd0ee139 | 789 | if(bluetooth.readable()) |
cgraham | 0:d69efd0ee139 | 790 | { |
cgraham | 0:d69efd0ee139 | 791 | pc.printf("Message receiving.\r\n"); |
cgraham | 0:d69efd0ee139 | 792 | result = decode_message(); |
cgraham | 0:d69efd0ee139 | 793 | } |
cgraham | 0:d69efd0ee139 | 794 | |
cgraham | 0:d69efd0ee139 | 795 | if(result) //successful decode Bluetooth packet |
cgraham | 0:d69efd0ee139 | 796 | { |
cgraham | 0:d69efd0ee139 | 797 | result = false; |
cgraham | 0:d69efd0ee139 | 798 | |
cgraham | 0:d69efd0ee139 | 799 | if(Request_image) |
cgraham | 0:d69efd0ee139 | 800 | { |
cgraham | 0:d69efd0ee139 | 801 | Request_image = false; |
cgraham | 0:d69efd0ee139 | 802 | pc.printf("Initiate to send first pic.\r\n"); |
cgraham | 0:d69efd0ee139 | 803 | send_pic(1); |
cgraham | 0:d69efd0ee139 | 804 | } |
cgraham | 0:d69efd0ee139 | 805 | |
cgraham | 0:d69efd0ee139 | 806 | //NACK received |
cgraham | 0:d69efd0ee139 | 807 | if(NACK_received) |
cgraham | 0:d69efd0ee139 | 808 | { |
cgraham | 0:d69efd0ee139 | 809 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 810 | NACK_received = false; |
cgraham | 0:d69efd0ee139 | 811 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 812 | attempt = 0; |
cgraham | 0:d69efd0ee139 | 813 | pc.printf("NACK received\r\n\r\n"); |
cgraham | 0:d69efd0ee139 | 814 | //send_pic(1); resend last packet...not pic |
cgraham | 0:d69efd0ee139 | 815 | if(init_first_pic) //initiate again |
cgraham | 0:d69efd0ee139 | 816 | { |
cgraham | 0:d69efd0ee139 | 817 | pc.printf("Re-Initiate sending Pic 1.\r\n"); |
cgraham | 0:d69efd0ee139 | 818 | send_pic(1); |
cgraham | 0:d69efd0ee139 | 819 | } |
cgraham | 0:d69efd0ee139 | 820 | else if(first_pic_started) //resend last packet of 1st pic |
cgraham | 0:d69efd0ee139 | 821 | { |
cgraham | 0:d69efd0ee139 | 822 | pc.printf("Resending packet number #%d of first pic.\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 823 | packet_index--; |
cgraham | 0:d69efd0ee139 | 824 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 825 | { |
cgraham | 0:d69efd0ee139 | 826 | temp_result = send_packet(1, packet_index); |
cgraham | 0:d69efd0ee139 | 827 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 828 | { |
cgraham | 0:d69efd0ee139 | 829 | packet_index++; |
cgraham | 0:d69efd0ee139 | 830 | } |
cgraham | 0:d69efd0ee139 | 831 | else |
cgraham | 0:d69efd0ee139 | 832 | { |
cgraham | 0:d69efd0ee139 | 833 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 834 | } |
cgraham | 0:d69efd0ee139 | 835 | } |
cgraham | 0:d69efd0ee139 | 836 | else |
cgraham | 0:d69efd0ee139 | 837 | { |
cgraham | 0:d69efd0ee139 | 838 | first_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 839 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 840 | } |
cgraham | 0:d69efd0ee139 | 841 | } |
cgraham | 0:d69efd0ee139 | 842 | |
cgraham | 0:d69efd0ee139 | 843 | else if(init_second_pic) //re-initiate 2nd pic |
cgraham | 0:d69efd0ee139 | 844 | { |
cgraham | 0:d69efd0ee139 | 845 | pc.printf("Re-Initiate sending Pic 2.\r\n"); |
cgraham | 0:d69efd0ee139 | 846 | send_pic(2); |
cgraham | 0:d69efd0ee139 | 847 | } |
cgraham | 0:d69efd0ee139 | 848 | else if(second_pic_started) //resend last packet of 2nd pic |
cgraham | 0:d69efd0ee139 | 849 | { |
cgraham | 0:d69efd0ee139 | 850 | pc.printf("Resending packet number #%d of second pic.\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 851 | packet_index--; |
cgraham | 0:d69efd0ee139 | 852 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 853 | { |
cgraham | 0:d69efd0ee139 | 854 | temp_result = send_packet(2, packet_index); |
cgraham | 0:d69efd0ee139 | 855 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 856 | { |
cgraham | 0:d69efd0ee139 | 857 | packet_index++; |
cgraham | 0:d69efd0ee139 | 858 | } |
cgraham | 0:d69efd0ee139 | 859 | else |
cgraham | 0:d69efd0ee139 | 860 | { |
cgraham | 0:d69efd0ee139 | 861 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 862 | } |
cgraham | 0:d69efd0ee139 | 863 | } |
cgraham | 0:d69efd0ee139 | 864 | else |
cgraham | 0:d69efd0ee139 | 865 | { |
cgraham | 0:d69efd0ee139 | 866 | second_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 867 | second_pic_started = false; |
cgraham | 0:d69efd0ee139 | 868 | } |
cgraham | 0:d69efd0ee139 | 869 | } |
cgraham | 0:d69efd0ee139 | 870 | |
cgraham | 0:d69efd0ee139 | 871 | } |
cgraham | 0:d69efd0ee139 | 872 | |
cgraham | 0:d69efd0ee139 | 873 | if(ACK_received) //Send result via bluetooth, up on request |
cgraham | 0:d69efd0ee139 | 874 | { |
cgraham | 0:d69efd0ee139 | 875 | pc.printf("ACK received\r\n\r\n"); |
cgraham | 0:d69efd0ee139 | 876 | ACK_received = false; |
cgraham | 0:d69efd0ee139 | 877 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 878 | wait_ack_timer.stop(); |
cgraham | 0:d69efd0ee139 | 879 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 880 | attempt = 0; |
cgraham | 0:d69efd0ee139 | 881 | if(init_first_pic) |
cgraham | 0:d69efd0ee139 | 882 | { |
cgraham | 0:d69efd0ee139 | 883 | pc.printf("Initiating to send first pic\r\n"); |
cgraham | 0:d69efd0ee139 | 884 | init_first_pic = false; |
cgraham | 0:d69efd0ee139 | 885 | packet_index = 0; |
cgraham | 0:d69efd0ee139 | 886 | first_pic_started = true; |
cgraham | 0:d69efd0ee139 | 887 | temp_result = send_packet(1, packet_index); //send first |
cgraham | 0:d69efd0ee139 | 888 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 889 | { |
cgraham | 0:d69efd0ee139 | 890 | packet_index++; |
cgraham | 0:d69efd0ee139 | 891 | } |
cgraham | 0:d69efd0ee139 | 892 | else |
cgraham | 0:d69efd0ee139 | 893 | { |
cgraham | 0:d69efd0ee139 | 894 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 895 | } |
cgraham | 0:d69efd0ee139 | 896 | } |
cgraham | 0:d69efd0ee139 | 897 | |
cgraham | 0:d69efd0ee139 | 898 | else if(first_pic_started) |
cgraham | 0:d69efd0ee139 | 899 | { |
cgraham | 0:d69efd0ee139 | 900 | pc.printf("Send packet #%d of first pic.\r\n", packet_index); |
cgraham | 0:d69efd0ee139 | 901 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 902 | { |
cgraham | 0:d69efd0ee139 | 903 | temp_result = send_packet(1, packet_index); |
cgraham | 0:d69efd0ee139 | 904 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 905 | { |
cgraham | 0:d69efd0ee139 | 906 | packet_index++; |
cgraham | 0:d69efd0ee139 | 907 | } |
cgraham | 0:d69efd0ee139 | 908 | else |
cgraham | 0:d69efd0ee139 | 909 | { |
cgraham | 0:d69efd0ee139 | 910 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 911 | } |
cgraham | 0:d69efd0ee139 | 912 | } |
cgraham | 0:d69efd0ee139 | 913 | else |
cgraham | 0:d69efd0ee139 | 914 | { |
cgraham | 0:d69efd0ee139 | 915 | first_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 916 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 917 | } |
cgraham | 0:d69efd0ee139 | 918 | } |
cgraham | 0:d69efd0ee139 | 919 | |
cgraham | 0:d69efd0ee139 | 920 | if(first_pic_completed && !init_second_pic)//init second_pic |
cgraham | 0:d69efd0ee139 | 921 | { |
cgraham | 0:d69efd0ee139 | 922 | pc.printf("Initiating to send 2nd pic\r\n"); |
cgraham | 0:d69efd0ee139 | 923 | first_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 924 | send_pic(2); |
cgraham | 0:d69efd0ee139 | 925 | } |
cgraham | 0:d69efd0ee139 | 926 | |
cgraham | 0:d69efd0ee139 | 927 | else if(init_second_pic) |
cgraham | 0:d69efd0ee139 | 928 | { |
cgraham | 0:d69efd0ee139 | 929 | pc.printf("Sending packet #%d of pic 2\r\n", packet_index); |
cgraham | 0:d69efd0ee139 | 930 | init_second_pic = false; |
cgraham | 0:d69efd0ee139 | 931 | packet_index = 0; |
cgraham | 0:d69efd0ee139 | 932 | second_pic_started = true; |
cgraham | 0:d69efd0ee139 | 933 | temp_result = send_packet(2, packet_index); //send second |
cgraham | 0:d69efd0ee139 | 934 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 935 | { |
cgraham | 0:d69efd0ee139 | 936 | packet_index++; |
cgraham | 0:d69efd0ee139 | 937 | } |
cgraham | 0:d69efd0ee139 | 938 | else |
cgraham | 0:d69efd0ee139 | 939 | { |
cgraham | 0:d69efd0ee139 | 940 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 941 | } |
cgraham | 0:d69efd0ee139 | 942 | } |
cgraham | 0:d69efd0ee139 | 943 | |
cgraham | 0:d69efd0ee139 | 944 | else if(second_pic_started) |
cgraham | 0:d69efd0ee139 | 945 | { |
cgraham | 0:d69efd0ee139 | 946 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 947 | { |
cgraham | 0:d69efd0ee139 | 948 | temp_result = send_packet(2, packet_index); //send second |
cgraham | 0:d69efd0ee139 | 949 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 950 | { |
cgraham | 0:d69efd0ee139 | 951 | packet_index++; |
cgraham | 0:d69efd0ee139 | 952 | } |
cgraham | 0:d69efd0ee139 | 953 | else |
cgraham | 0:d69efd0ee139 | 954 | { |
cgraham | 0:d69efd0ee139 | 955 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 956 | } |
cgraham | 0:d69efd0ee139 | 957 | } |
cgraham | 0:d69efd0ee139 | 958 | else |
cgraham | 0:d69efd0ee139 | 959 | { |
cgraham | 0:d69efd0ee139 | 960 | second_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 961 | second_pic_started = false; |
cgraham | 0:d69efd0ee139 | 962 | } |
cgraham | 0:d69efd0ee139 | 963 | } |
cgraham | 0:d69efd0ee139 | 964 | |
cgraham | 0:d69efd0ee139 | 965 | if(second_pic_completed) |
cgraham | 0:d69efd0ee139 | 966 | { |
cgraham | 0:d69efd0ee139 | 967 | pc.printf("Deleting files\r\n"); |
cgraham | 0:d69efd0ee139 | 968 | second_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 969 | |
cgraham | 0:d69efd0ee139 | 970 | snprintf(fname, sizeof(fname) - 1, FILENAME, cnt - 1); |
cgraham | 0:d69efd0ee139 | 971 | delete_file(fname); |
cgraham | 0:d69efd0ee139 | 972 | snprintf(fname, sizeof(fname) - 1, FILENAME2, cnt - 1); |
cgraham | 0:d69efd0ee139 | 973 | delete_file(fname); |
cgraham | 0:d69efd0ee139 | 974 | cnt--; |
cgraham | 0:d69efd0ee139 | 975 | fp = fopen(Setting, "w"); |
cgraham | 0:d69efd0ee139 | 976 | fprintf(fp, "%d\r\n", cnt); |
cgraham | 0:d69efd0ee139 | 977 | fprintf(fp, "%d", Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 978 | fclose(fp); |
cgraham | 0:d69efd0ee139 | 979 | |
cgraham | 0:d69efd0ee139 | 980 | } |
cgraham | 0:d69efd0ee139 | 981 | |
cgraham | 0:d69efd0ee139 | 982 | } |
cgraham | 0:d69efd0ee139 | 983 | |
cgraham | 0:d69efd0ee139 | 984 | |
cgraham | 0:d69efd0ee139 | 985 | } |
cgraham | 0:d69efd0ee139 | 986 | |
cgraham | 0:d69efd0ee139 | 987 | if ((Start == Pressed) && !timer_started && test_ended) //Button pressed, take first pic |
cgraham | 0:d69efd0ee139 | 988 | { |
cgraham | 0:d69efd0ee139 | 989 | pc.printf("Start Test................\r\n"); |
cgraham | 0:d69efd0ee139 | 990 | wait_ms(200); |
cgraham | 0:d69efd0ee139 | 991 | if(Start == Pressed) |
cgraham | 0:d69efd0ee139 | 992 | { |
cgraham | 0:d69efd0ee139 | 993 | snprintf(fname, sizeof(fname) - 1, FILENAME, cnt); |
cgraham | 0:d69efd0ee139 | 994 | take_pic(fname); |
cgraham | 0:d69efd0ee139 | 995 | wait_timer.reset(); |
cgraham | 0:d69efd0ee139 | 996 | wait_timer.start(); |
cgraham | 0:d69efd0ee139 | 997 | timer_started = true; |
cgraham | 0:d69efd0ee139 | 998 | test_ended = false; |
cgraham | 0:d69efd0ee139 | 999 | } |
cgraham | 0:d69efd0ee139 | 1000 | } |
cgraham | 0:d69efd0ee139 | 1001 | /* else if (Start == 1) |
cgraham | 0:d69efd0ee139 | 1002 | { |
cgraham | 0:d69efd0ee139 | 1003 | timer_started = false; |
cgraham | 0:d69efd0ee139 | 1004 | final_img = false; |
cgraham | 0:d69efd0ee139 | 1005 | wait_timer.stop(); |
cgraham | 0:d69efd0ee139 | 1006 | test_ended = true; |
cgraham | 0:d69efd0ee139 | 1007 | }*/ |
cgraham | 0:d69efd0ee139 | 1008 | |
cgraham | 0:d69efd0ee139 | 1009 | if((wait_timer.read() > Wait_Time_pic) && !final_img) //After set time, take second pic |
cgraham | 0:d69efd0ee139 | 1010 | { |
cgraham | 0:d69efd0ee139 | 1011 | pc.printf("Take 2nd pic\r\n"); |
cgraham | 0:d69efd0ee139 | 1012 | snprintf(fname, sizeof(fname) - 1, FILENAME2, cnt); |
cgraham | 0:d69efd0ee139 | 1013 | take_pic(fname); |
cgraham | 0:d69efd0ee139 | 1014 | wait_timer.stop(); |
cgraham | 0:d69efd0ee139 | 1015 | wait_timer.reset(); |
cgraham | 0:d69efd0ee139 | 1016 | timer_started = false; |
cgraham | 0:d69efd0ee139 | 1017 | cnt++; |
cgraham | 0:d69efd0ee139 | 1018 | fp = fopen(Setting, "w"); |
cgraham | 0:d69efd0ee139 | 1019 | fprintf(fp, "%d\r\n", cnt); |
cgraham | 0:d69efd0ee139 | 1020 | fprintf(fp, "%d", Wait_Time_pic); |
cgraham | 0:d69efd0ee139 | 1021 | fclose(fp); |
cgraham | 0:d69efd0ee139 | 1022 | final_img = true; |
cgraham | 0:d69efd0ee139 | 1023 | pc.printf("file size of 2nd pic is %d bytes.\r\n", GetFileSize(fname)); |
cgraham | 0:d69efd0ee139 | 1024 | } |
cgraham | 0:d69efd0ee139 | 1025 | |
cgraham | 0:d69efd0ee139 | 1026 | if((wait_ack_timer.read() > 3) && wait_ack) //Need to edit to resend last packet |
cgraham | 0:d69efd0ee139 | 1027 | { |
cgraham | 0:d69efd0ee139 | 1028 | pc.printf("ACK timer timed out.\r\n"); |
cgraham | 0:d69efd0ee139 | 1029 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 1030 | attempt++; |
cgraham | 0:d69efd0ee139 | 1031 | if(init_first_pic) |
cgraham | 0:d69efd0ee139 | 1032 | { |
cgraham | 0:d69efd0ee139 | 1033 | pc.printf("Re-Initiate sending Pic 1.\r\n"); |
cgraham | 0:d69efd0ee139 | 1034 | send_pic(1); |
cgraham | 0:d69efd0ee139 | 1035 | } |
cgraham | 0:d69efd0ee139 | 1036 | else if(first_pic_started) |
cgraham | 0:d69efd0ee139 | 1037 | { |
cgraham | 0:d69efd0ee139 | 1038 | pc.printf("Resending packet number #%d of first pic.\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 1039 | packet_index--; |
cgraham | 0:d69efd0ee139 | 1040 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 1041 | { |
cgraham | 0:d69efd0ee139 | 1042 | temp_result = send_packet(1, packet_index); |
cgraham | 0:d69efd0ee139 | 1043 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 1044 | { |
cgraham | 0:d69efd0ee139 | 1045 | packet_index++; |
cgraham | 0:d69efd0ee139 | 1046 | } |
cgraham | 0:d69efd0ee139 | 1047 | else |
cgraham | 0:d69efd0ee139 | 1048 | { |
cgraham | 0:d69efd0ee139 | 1049 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 1050 | } |
cgraham | 0:d69efd0ee139 | 1051 | } |
cgraham | 0:d69efd0ee139 | 1052 | else |
cgraham | 0:d69efd0ee139 | 1053 | { |
cgraham | 0:d69efd0ee139 | 1054 | first_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 1055 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 1056 | } |
cgraham | 0:d69efd0ee139 | 1057 | } |
cgraham | 0:d69efd0ee139 | 1058 | |
cgraham | 0:d69efd0ee139 | 1059 | else if(init_second_pic) |
cgraham | 0:d69efd0ee139 | 1060 | { |
cgraham | 0:d69efd0ee139 | 1061 | pc.printf("Re-Initiate sending Pic 2.\r\n"); |
cgraham | 0:d69efd0ee139 | 1062 | send_pic(2); |
cgraham | 0:d69efd0ee139 | 1063 | } |
cgraham | 0:d69efd0ee139 | 1064 | else if(second_pic_started) |
cgraham | 0:d69efd0ee139 | 1065 | { |
cgraham | 0:d69efd0ee139 | 1066 | pc.printf("Resending packet number #%d of second pic.\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 1067 | packet_index--; |
cgraham | 0:d69efd0ee139 | 1068 | if(packet_index < num_of_packets) |
cgraham | 0:d69efd0ee139 | 1069 | { |
cgraham | 0:d69efd0ee139 | 1070 | temp_result = send_packet(2, packet_index); |
cgraham | 0:d69efd0ee139 | 1071 | if(temp_result) |
cgraham | 0:d69efd0ee139 | 1072 | { |
cgraham | 0:d69efd0ee139 | 1073 | packet_index++; |
cgraham | 0:d69efd0ee139 | 1074 | } |
cgraham | 0:d69efd0ee139 | 1075 | else |
cgraham | 0:d69efd0ee139 | 1076 | { |
cgraham | 0:d69efd0ee139 | 1077 | pc.printf("FAIL to decode packet: %d\r\n", packet_index - 1); |
cgraham | 0:d69efd0ee139 | 1078 | } |
cgraham | 0:d69efd0ee139 | 1079 | } |
cgraham | 0:d69efd0ee139 | 1080 | else |
cgraham | 0:d69efd0ee139 | 1081 | { |
cgraham | 0:d69efd0ee139 | 1082 | first_pic_completed = true; |
cgraham | 0:d69efd0ee139 | 1083 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 1084 | } |
cgraham | 0:d69efd0ee139 | 1085 | } |
cgraham | 0:d69efd0ee139 | 1086 | } |
cgraham | 0:d69efd0ee139 | 1087 | |
cgraham | 0:d69efd0ee139 | 1088 | if(attempt > 2) |
cgraham | 0:d69efd0ee139 | 1089 | { |
cgraham | 0:d69efd0ee139 | 1090 | pc.printf("Three attempts already...no more sending"); |
cgraham | 0:d69efd0ee139 | 1091 | init_first_pic = false; |
cgraham | 0:d69efd0ee139 | 1092 | init_second_pic = false; |
cgraham | 0:d69efd0ee139 | 1093 | first_pic_started = false; |
cgraham | 0:d69efd0ee139 | 1094 | second_pic_started = false; |
cgraham | 0:d69efd0ee139 | 1095 | first_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 1096 | second_pic_completed = false; |
cgraham | 0:d69efd0ee139 | 1097 | start_sending_pic = false; |
cgraham | 0:d69efd0ee139 | 1098 | attempt = 0; |
cgraham | 0:d69efd0ee139 | 1099 | wait_ack = false; |
cgraham | 0:d69efd0ee139 | 1100 | wait_ack_timer.stop(); |
cgraham | 0:d69efd0ee139 | 1101 | wait_ack_timer.reset(); |
cgraham | 0:d69efd0ee139 | 1102 | timer_started = false; |
cgraham | 0:d69efd0ee139 | 1103 | } |
cgraham | 0:d69efd0ee139 | 1104 | |
cgraham | 0:d69efd0ee139 | 1105 | |
cgraham | 0:d69efd0ee139 | 1106 | } |
cgraham | 0:d69efd0ee139 | 1107 | |
cgraham | 0:d69efd0ee139 | 1108 | } |
cgraham | 0:d69efd0ee139 | 1109 |