//#DOC Main, program entry and main loop
#include "main.h"
#include <otSerial.h>
#include <otTimer.h>
#include <otPrintf.h>
#include <otCamera.h>
#include <otImageSensor.h>
#include <otImage.h>
#include <otI2cBus.h>
#include <otFILE.h>
#include <otImageDetection.h>

otCamera            camera;     // Library for the camera control
otImageSensor       sensor;     // Library for image sensor settings
otImage             image;      // Image store and processing library
otFILE              file;       // Library for file access
otImageDetection    ai;         // Image dtection library

void setup()
{
    // Init connection with the console via UART0
    UartEnableSignals(UART0);
    UartSetBaud(UART0, 115200);
    // Init stout used by printf
    setStdout(4096, UART0);   // printf output is now directed on UART0
    // Init the timer for time measure
    TimerSetAsCounter(TIMER0);
    TimerEnable(TIMER0, true);
    // SMB bus init
    I2cBusReset();
    I2cBusFrequency(100, 30);
    // Wait the console has been started
    DelayMs(1000);      // Wait terminal start
    // Init the standard camera based on MT9V032
    camera.init(otCamera::CM_STANDARD);
    // Init image sensor
    if(!sensor.init(otImageSensor::IS_MT9V032, otImageSensor::MT9V03x_00))
    {
        printf("Can't find image sensor!\n");
        IDLE;
    }
    // Show sensor resolution
    printf("Sensor resolution: %dx%d\n", sensor.horPixel(), sensor.verPixel());
    printf("Init SD and loading detection definitions\n");
    if(!file.init())
    {
        // Display error message
        printf("STATUS: %s\n", file.status());
        // Unmount and turn off SD
        file.end();
        DelayMs(100);
        IDLE;
    }
    
    if(!ai.init(8, &file))
    {
        printf("Error on otImageDetection init!\n");
        IDLE;
    }
    sensor.setBinning(4, 4);
    image.create(sensor.horPixel(), sensor.verPixel(), 1, otImage::IMG_U8);
}

void loop()
{
    U32     et;
    // Start measure of time
    ElapsedTimeStart(TIMER0);
    // Grab an image
    camera.grab(image);
    // Detect an object if present
    U16     objs = ai.detect(&image, 0.0, 1.2, 0.1, 80, 90);
    // Get elapsed time
    et = ElapsedTimeEnd(TIMER0);
    
    if(objs)
    {
        int     xs, ys, xd, yd;
        objs = ai.roiFilter(5.0f);
        if(objs)
        {
            ai.roi(0, xs, ys, xd, yd);
            printf("Face[0] : Xs: %d, Ys: %d, Xd: %d, Yd: %d, ET: %u ms\n", xs, ys, xd, yd, et);
        }
        else
            printf("Below minimum threshold, ET: %u ms\n", et);
    }
    else printf("Not Detected, ET: %u ms\n", et);
}

/* PROGRAM OUTPUT **************************************************************
********************************************************************************
To perform this test an image of a face was placed in front of the camera.
Every now and then he was moved ...

Sensor resolution: 752x480
Init SD and loading detection definitions
Below minimum threshold, ET: 430 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 391 ms
Below minimum threshold, ET: 356 ms
Below minimum threshold, ET: 347 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 388 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 384 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 363 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 366 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 389 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 376 ms
Below minimum threshold, ET: 351 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 311 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 370 ms
Below minimum threshold, ET: 356 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Below minimum threshold, ET: 344 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 395 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 352 ms
Below minimum threshold, ET: 369 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 360 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 333 ms
Below minimum threshold, ET: 386 ms
Below minimum threshold, ET: 393 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Below minimum threshold, ET: 361 ms
Below minimum threshold, ET: 333 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 378 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 318 ms
Below minimum threshold, ET: 377 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 328 ms
Below minimum threshold, ET: 383 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 402 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 371 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 377 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 377 ms
Below minimum threshold, ET: 338 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 404 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Below minimum threshold, ET: 334 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 363 ms
Below minimum threshold, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Not Detected, ET: 301 ms
Not Detected, ET: 189 ms
Below minimum threshold, ET: 186 ms
Not Detected, ET: 137 ms
Not Detected, ET: 58 ms
Not Detected, ET: 73 ms
Not Detected, ET: 58 ms
Not Detected, ET: 64 ms
Not Detected, ET: 62 ms
Not Detected, ET: 69 ms
Not Detected, ET: 65 ms
Not Detected, ET: 55 ms
Not Detected, ET: 74 ms
Not Detected, ET: 228 ms
Below minimum threshold, ET: 338 ms
Below minimum threshold, ET: 346 ms
Below minimum threshold, ET: 377 ms
Below minimum threshold, ET: 309 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 385 ms
Below minimum threshold, ET: 356 ms
Below minimum threshold, ET: 395 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 353 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 371 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 348 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 341 ms
Below minimum threshold, ET: 380 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 406 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 355 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Below minimum threshold, ET: 393 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 378 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 356 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 382 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 336 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 326 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 364 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 339 ms
Not Detected, ET: 47 ms
Not Detected, ET: 49 ms
Not Detected, ET: 60 ms
Not Detected, ET: 47 ms
Not Detected, ET: 61 ms
Not Detected, ET: 49 ms
Not Detected, ET: 62 ms
Not Detected, ET: 46 ms
Not Detected, ET: 110 ms
Below minimum threshold, ET: 316 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 375 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 324 ms
Below minimum threshold, ET: 334 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Below minimum threshold, ET: 373 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 320 ms
Below minimum threshold, ET: 345 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 362 ms
Below minimum threshold, ET: 375 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 373 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 343 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 395 ms
Below minimum threshold, ET: 367 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 335 ms
Below minimum threshold, ET: 381 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 381 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 352 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 317 ms
Below minimum threshold, ET: 371 ms
Below minimum threshold, ET: 339 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 390 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 364 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 346 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 331 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Below minimum threshold, ET: 336 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 370 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 374 ms
Below minimum threshold, ET: 326 ms
Not Detected, ET: 187 ms
Not Detected, ET: 194 ms
Not Detected, ET: 158 ms

*/