// Тест сделан только для отладки целевого модуля.
// Может применяться для ознокомления с функционалом модуля.

//******************************************** Включаемые файлы *********************************************

#include "flash_mem_tst.h"
#include "flash_mem.h"
#include "lmcal.h"
#include "dbg_printf.h"

// #include "lprintf.h"
// #include "BSP_Manager.h"
#include "lta_private.h"
// #include "tcp_protocol.h"

#include <string.h>



//******************************************* Локальные константы *******************************************

#define TCP_DEFAULT_CMD_PORT       (11114)
#define TCP_DEFAULT_DATA_PORT      (11115)


//******************************************** Определения типов ********************************************


//************************************ Глобальные (публичные) переменные ************************************

// Указатель на пользовательские настройки
extern fm_user_settings_data_t* fm_user_settings_data;

// Указатель на заводскую информацию
extern fm_factory_mem_data_t* fm_factory_mem_data;

// Указатель на калибровки
extern uint8_t* fm_cbr_data;


//************************************* Локальные (приватные) переменные ************************************



//***********************************************************************************************************
//******************************** Определения локальных (приватных) функций ********************************
//***********************************************************************************************************



//***********************************************************************************************************
//******************************* Определения глобальных (публичных) функций ********************************
//***********************************************************************************************************

//-----------------------------------------------------------------------------------------------------------
// Тест чтения сектора
//-----------------------------------------------------------------------------------------------------------
void FM_TST_Read(void)
{
    DBG_LOGD("Start Test\n");
    
    fm_read();

    if (fm_user_settings_data == NULL)
    {
        // Память пуста
        DBG_LOGD("user_settings is empty! \n");
    }

    if (fm_factory_mem_data == NULL)
    {
        // Память пуста
        DBG_LOGD("factory_mem is empty! \n");
    }

    if (fm_cbr_data == NULL)
    {
        // Память пуста
        DBG_LOGD("cbr is empty! \n");
    }
    
    DBG_LOGD("Stop Test\n");
}



//-----------------------------------------------------------------------------------------------------------
// Тест очистки сектора
//-----------------------------------------------------------------------------------------------------------
void FM_TST_EraseUser(void)
{
    DBG_LOGD("Flash channel erasing!\n");
    lmcal_flash_erase(FM_CH_USER_MEM, 0, 1000, NULL);
}

void FM_TST_EraseFactory(void)
{
    DBG_LOGD("Flash channel erasing!\n");
    lmcal_flash_erase(FM_CH_FACTORY_MEM, 0, 1000, NULL);
}

void FM_TST_EraseCbr(void)
{
    DBG_LOGD("Flash channel erasing!\n");
    lmcal_flash_erase(FM_CH_CALIB_MEM, 0, 1000, NULL);
}



//-----------------------------------------------------------------------------------------------------------
// Тест записи сектора
//-----------------------------------------------------------------------------------------------------------
void FM_TST_WriteUser(void)
{
    fun_res_t err = ERR_OK;

    DBG_LOGD("Start Test\n");

    fm_user_settings_data_t st_test;

    uint8_t a_addr[LTA_IPV4_ADDR_SIZE] = {192,168,0,1};
    uint8_t a_mask[LTA_IPV4_ADDR_SIZE] = {255,255,255,0};
    uint8_t a_gate[LTA_IPV4_ADDR_SIZE] = {192,168,0,100};
    uint8_t a_mac[LTA_MAC_ADDR_SIZE]   = {10,20,30,40,50,60};

    st_test.flags = 0;
    memcpy(&st_test.mac,       a_mac,  LTA_MAC_ADDR_SIZE);
    memcpy(&st_test.ipv4_addr, a_addr, LTA_IPV4_ADDR_SIZE);
    memcpy(&st_test.ipv4_mask, a_mask, LTA_IPV4_ADDR_SIZE);
    memcpy(&st_test.ipv4_gate, a_gate, LTA_IPV4_ADDR_SIZE);
    st_test.tcp_cmd_port  = TCP_DEFAULT_CMD_PORT;
    st_test.tcp_data_port = TCP_DEFAULT_DATA_PORT;

    memset(st_test.res, 0, FM_RES_DATA_SIZE);

    // Запись без пароля
    err = fm_write_user_data(&st_test, NULL, NULL);
    DBG_LOGD("Without password. Err= %s\n", get_err_name(err));

    // Попытка 2 - Запись без пароля
    err = fm_write_user_data(&st_test, NULL, NULL);
    DBG_LOGD("Without password 2. Err= %s\n", get_err_name(err));

    // Установка пароля
    char pswrd_new[FM_PASSWD_SIZE];
    char pswrd_new2[FM_PASSWD_SIZE];
    memset(pswrd_new, 0, FM_PASSWD_SIZE);
    memset(pswrd_new2, 0, FM_PASSWD_SIZE);
    strcpy(pswrd_new, "123456\0");
    strcpy(pswrd_new2, "111111\0");
    
    err = fm_write_user_data(&st_test, NULL, pswrd_new);
    DBG_LOGD("With password. Err= %s\n", get_err_name(err));

    // Попытка записи - не учитываем пароль
    err = fm_write_user_data(&st_test, NULL, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With empty password. Err= %s\n", get_err_name(err));

    // Попытка записи - Ошибочный пароль
    err = fm_write_user_data(&st_test, pswrd_new2, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With wrong password. Err= %s\n", get_err_name(err));

    // Попытка записи - учитываем пароль
    err = fm_write_user_data(&st_test, pswrd_new, NULL);
    DBG_LOGD("With correct password. Err= %s\n", get_err_name(err));

    DBG_LOGD("Stop Test\n");
}


void FM_TST_WriteFactory(void)
{
    fun_res_t err = ERR_OK;

    DBG_LOGD("Start Test\n");

    fm_factory_mem_data_t st_test;
    uint8_t a_mac[LTA_MAC_ADDR_SIZE]   = {10,20,30,40,50,60};

    memcpy(&st_test.name,      "LTAxx\0", 6);
    memcpy(&st_test.serial,    "ser12345\0", 9);
    memcpy(&st_test.brd_rev,   "v1\0", 3);
    memcpy(&st_test.mac,       a_mac,  LTA_MAC_ADDR_SIZE);
    memset(st_test.res, 0, FM_RES_DATA_SIZE);

    // Запись без пароля
    err = fm_write_factory_data(&st_test, NULL, NULL);
    DBG_LOGD("Without password. Err= %s\n", get_err_name(err));

    // Попытка 2 - Запись без пароля
    err = fm_write_factory_data(&st_test, NULL, NULL);
    DBG_LOGD("Without password 2. Err= %s\n", get_err_name(err));

    // Установка пароля
    char pswrd_new[FM_PASSWD_SIZE];
    char pswrd_new2[FM_PASSWD_SIZE];
    memset(pswrd_new, 0, FM_PASSWD_SIZE);
    memset(pswrd_new2, 0, FM_PASSWD_SIZE);
    strcpy(pswrd_new, "123456\0");
    strcpy(pswrd_new2, "111111\0");
    
    err = fm_write_factory_data(&st_test, NULL, pswrd_new);
    DBG_LOGD("With password. Err= %s\n", get_err_name(err));

    // Попытка записи - не учитываем пароль
    err = fm_write_factory_data(&st_test, NULL, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With empty password. Err= %s\n", get_err_name(err));

    // Попытка записи - Ошибочный пароль
    err = fm_write_factory_data(&st_test, pswrd_new2, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With wrong password. Err= %s\n", get_err_name(err));

    // Попытка записи - учитываем пароль
    err = fm_write_factory_data(&st_test, pswrd_new, NULL);
    DBG_LOGD("With correct password. Err= %s\n", get_err_name(err));

    DBG_LOGD("Stop Test\n");
}



void FM_TST_WriteCbr(void)
{
    fun_res_t err = ERR_OK;

    DBG_LOGD("Start Test\n");

    uint8_t st_test[FM_CBR_SIZE];

    for (u16 i=0; i < FM_CBR_SIZE; i++)
    {
        st_test[i] = i;
    }



    // Запись без пароля
    err = fm_write_cbr_data(st_test, NULL, NULL);
    DBG_LOGD("Without password. Err= %s\n", get_err_name(err));

    // Попытка 2 - Запись без пароля
    err = fm_write_cbr_data(st_test, NULL, NULL);
    DBG_LOGD("Without password 2. Err= %s\n", get_err_name(err));

    // Установка пароля
    char pswrd_new[FM_PASSWD_SIZE];
    char pswrd_new2[FM_PASSWD_SIZE];
    memset(pswrd_new, 0, FM_PASSWD_SIZE);
    memset(pswrd_new2, 0, FM_PASSWD_SIZE);
    strcpy(pswrd_new, "123456\0");
    strcpy(pswrd_new2, "111111\0");
    
    err = fm_write_cbr_data(st_test, NULL, pswrd_new);
    DBG_LOGD("With password. Err= %s\n", get_err_name(err));

    // Попытка записи - не учитываем пароль
    err = fm_write_cbr_data(st_test, NULL, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With empty password. Err= %s\n", get_err_name(err));

    // Попытка записи - Ошибочный пароль
    err = fm_write_cbr_data(st_test, pswrd_new2, NULL);
    if (err != ERR_OK) err = ERR_OK;
    DBG_LOGD("With wrong password. Err= %s\n", get_err_name(err));

    // Попытка записи - учитываем пароль
    err = fm_write_cbr_data(st_test, pswrd_new, NULL);
    DBG_LOGD("With correct password. Err= %s\n", get_err_name(err));

    DBG_LOGD("Stop Test\n");
}


//*********************************************** КОНЕЦ ФАЙЛА ***********************************************
