/****************************************************************************/
/* Copyright 2012 MBARI.                                                    */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
#include "config.h"
#include "flash_mem.h"
#include "sys_defs.h"

typedef struct
{
    ConfigData config;
    unsigned int checksum;
} ConfigBlock;

unsigned int calcCheckSum(char* buff, int size);


/****************************************************************************/
/*                             Config functions                             */
/****************************************************************************/
int cfgCheck(ConfigData* config)
{
    if ( config->bootFlag != DEFAULT_BOOT_FLAG )
        return -2;
    
    switch ( config->captureMode )
    {
        case CAPTURE_MODE_OFF: break;
        case CAPTURE_MODE_IMG: break;
        case CAPTURE_MODE_VID: break;
        default: return -3;
    }
         
    if ( (config->startOfDeploy < START_DEPLOY_MIN) || 
         (config->startOfDeploy > START_DEPLOY_MAX) )
         return -4;

    if ( (config->lenOfDeploy < LEN_DEPLOY_MIN) || 
         (config->lenOfDeploy > LEN_DEPLOY_MAX) )
         return -5;

    if ( (config->sampleInterval < SAMPLE_INT_MIN) || 
         (config->sampleInterval > SAMPLE_INT_MAX) )
         return -6;

    if ( (config->lenOfVideo < VIDEO_LEN_MIN) || 
         (config->lenOfVideo > VIDEO_LEN_MAX) )
         return -7;

    if ( (config->battLevel < BATT_LEVEL_MIN) || 
         (config->battLevel > BATT_LEVEL_MAX) )
         return -7;

    return 0;
}

int cfgRead(ConfigData* config)
{
    ConfigBlock cb;
    unsigned int cs_calc;

    /* read the configuation struct from memory */
    memRead((char*)&cb, sizeof(cb));

    cs_calc = calcCheckSum((char*)&cb.config, sizeof(ConfigData));

    if ( cs_calc != cb.checksum )
        return -1;

    /* assign stored data to the config data struct */
    config->bootFlag = cb.config.bootFlag;

    config->captureMode = cb.config.captureMode;
    config->startOfDeploy = cb.config.startOfDeploy;
    config->lenOfDeploy = cb.config.lenOfDeploy;
    config->sampleInterval = cb.config.sampleInterval;
    config->lenOfVideo = cb.config.lenOfVideo;
    config->battLevel = cb.config.battLevel;

    return cfgCheck(config);
}

int cfgWrite(ConfigData* config)
{
    ConfigBlock cb;
    
    /* if config params are not in a valid range, don't write it */
    if ( cfgCheck(config) != 0 )
        return -1;

    /* assign stored data to the config data struct */
    cb.config.bootFlag = config->bootFlag;
    cb.config.captureMode = config->captureMode;
    cb.config.startOfDeploy = config->startOfDeploy;
    cb.config.lenOfDeploy = config->lenOfDeploy;
    cb.config.sampleInterval = config->sampleInterval;
    cb.config.lenOfVideo = config->lenOfVideo;
    cb.config.battLevel = config->battLevel;

    /* calc and assign the checksum */
    cb.checksum = calcCheckSum((char*)&cb.config, sizeof(ConfigData));

    /* erase the old config */
    memErase();

    /* write the new config */
    memWrite((char*)&cb, sizeof(cb));
    
    return 0;
}

int cfgDefault()
{
    ConfigBlock cb;
    
    /* assign stored data to the config data struct */
    cb.config.bootFlag = DEFAULT_BOOT_FLAG;
    cb.config.captureMode = CAPTURE_MODE_DEF;
    cb.config.startOfDeploy = START_DEPLOY_DEF;
    cb.config.lenOfDeploy = LEN_DEPLOY_DEF;
    cb.config.sampleInterval = SAMPLE_INT_DEF;
    cb.config.lenOfVideo = VIDEO_LEN_DEF;
    cb.config.battLevel = BATT_LEVEL_DEF;

    /* calc and assign the checksum */
    cb.checksum = calcCheckSum((char*)&cb.config, sizeof(ConfigData));

    /* erase the old config */
    memErase();

    /* write the new config */
    memWrite((char*)&cb, sizeof(cb));
    
    return 0;
}


int cfgSetBootFlag()
{
    ConfigBlock cb;
    
    /* set the boot flag */
    cb.config.bootFlag = ACTIVE_BOOT_FLAG;
    
    cb.config.captureMode = 0;
    cb.config.startOfDeploy = 0;
    cb.config.lenOfDeploy = 0;
    cb.config.sampleInterval = 0;
    cb.config.lenOfVideo = 0;
    cb.config.battLevel = 0;

    /* calc and assign the checksum */
    cb.checksum = calcCheckSum((char*)&cb.config, sizeof(ConfigData));

    /* erase the old config */
    memErase();

    /* write the new config */
    memWrite((char*)&cb, sizeof(cb));
    
    return 0;
}


unsigned int calcCheckSum(char* buff, int size)
{
    int i;
    unsigned int cs = 0;

    for (i = 0; i < size; i++)
        cs += buff[i];

    return cs;
}

