test

Dependencies:   Nanopb iSerial mbed BaseJpegDecode FatFileSystem SDFileSystem RingBuffer Camera_LS_Y201

Committer:
cgraham
Date:
Thu Sep 18 15:21:47 2014 +0000
Revision:
0:d69efd0ee139
test

Who changed what in which revision?

UserRevisionLine numberNew 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