contiki/examples/econotag-flash-test/econotag-flash-test.c

196 lines
6.0 KiB
C

/*
* Copyright (c) 2014, Lars Schmertmann <SmallLars@t-online.de>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* Flash test
*
* This file contains tests for econotag flash app
*
* \author
* Lars Schmertmann <SmallLars@t-online.de>
*/
#include "flash.h"
#include "contiki.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "../../tools/blaster/blaster.h"
#include "econotag-flash-test.h"
void
output_result(uint32_t i, uint32_t fail)
{
if(fail) {
printf(" Test %u failed!\n", i);
} else { printf(" Test %u succeed!\n", i);
}
}
void
test_flash_1()
{
uint8_t buffer[12];
uint32_t check_int, my_int = 12345678;
flash_setVar("Hello World!", RES_MY_STRING_1, LEN_MY_STRING_1);
flash_getVar(buffer, RES_MY_STRING_1, LEN_MY_STRING_1);
output_result(1, memcmp(buffer, "Hello World!", 12));
flash_setVar("Heureka!", RES_MY_STRING_2, LEN_MY_STRING_2);
flash_getVar(buffer, RES_MY_STRING_1, LEN_MY_STRING_1);
output_result(2, memcmp(buffer, "Hello World!", 12));
flash_getVar(buffer, RES_MY_STRING_2, LEN_MY_STRING_2);
output_result(3, memcmp(buffer, "Heureka!", 8));
flash_setVar(&my_int, RES_MY_INTEGER, LEN_MY_INTEGER);
flash_getVar(&check_int, RES_MY_INTEGER, LEN_MY_INTEGER);
output_result(4, check_int != my_int);
flash_getVar(buffer, RES_MY_STRING_1, LEN_MY_STRING_1);
output_result(5, memcmp(buffer, "Hello World!", 12));
flash_getVar(buffer, RES_MY_STRING_2, LEN_MY_STRING_2);
output_result(6, memcmp(buffer, "Heureka!", 8));
}
void
test_flash_2()
{
uint8_t buffer[12];
uint32_t check_int, my_int = 12345678;
flash_getVar(&check_int, RES_MY_INTEGER, LEN_MY_INTEGER);
output_result(1, check_int != my_int);
flash_getVar(buffer, RES_MY_STRING_1, LEN_MY_STRING_1);
output_result(2, memcmp(buffer, "Hello World!", 12));
flash_getVar(buffer, RES_MY_STRING_2, LEN_MY_STRING_2);
output_result(3, memcmp(buffer, "Heureka!", 8));
/* Block 1 max usage is 30 Byte -> Optimisation in Makefile */
output_result(4, flash_setVar("test", 0, 1) != gNvmErrInvalidPointer_c);
output_result(5, flash_setVar("test", 30, 1) != gNvmErrInvalidPointer_c);
output_result(6, flash_setVar("test", 29, 2) != gNvmErrAddressSpaceOverflow_c);
/* Block 2 max usage is 10 Byte -> Optimisation in Makefile */
output_result(7, flash_setVar("test", 4096, 1) != gNvmErrInvalidPointer_c);
output_result(8, flash_setVar("test", 4096 + 10, 1) != gNvmErrInvalidPointer_c);
output_result(9, flash_setVar("test", 4096 + 9, 2) != gNvmErrAddressSpaceOverflow_c);
}
void
test_flash_blaster()
{
uint8_t buffer[64];
flash_getVar(buffer, RES_NAME, LEN_NAME);
output_result(1, memcmp(buffer, "Econotag Flash Test Device", 27));
flash_getVar(buffer, RES_MODEL, LEN_MODEL);
output_result(2, memcmp(buffer, "Model 1234 for testing purposes only", 37));
}
void
test_flash_stack()
{
uint8_t buffer[32];
flash_stack_init();
output_result(1, flash_stack_size() != 0);
flash_stack_push("Hello World!", 12);
output_result(2, flash_stack_size() != 12);
flash_stack_read(buffer, 0, 12);
output_result(3, memcmp(buffer, "Hello World!", 12));
flash_stack_push("I love Contiki!", 15);
output_result(4, flash_stack_size() != 27);
flash_stack_read(buffer, 0, 12);
output_result(5, memcmp(buffer, "Hello World!", 12));
flash_stack_read(buffer, 12, 15);
output_result(6, memcmp(buffer, "I love Contiki!", 15));
flash_stack_init();
output_result(7, flash_stack_size() != 0);
uint32_t i;
for(i = 1; i < 256; i++) {
flash_stack_push("I love Contiki! ", 16);
}
output_result(8, flash_stack_size() != 4080);
output_result(9, flash_stack_push("1I love Contiki! ", 17) != gNvmErrAddressSpaceOverflow_c);
}
/* Start Process */
PROCESS(server_firmware, "Server Firmware");
AUTOSTART_PROCESSES(&server_firmware);
PROCESS_THREAD(server_firmware, ev, data) {
PROCESS_BEGIN();
if(flash_cmp("\001", RES_DONTCLEAR, LEN_DONTCLEAR)) {
printf("Initializing flash ... ");
flash_init();
printf("DONE\n");
flash_setVar("\001", RES_DONTCLEAR, LEN_DONTCLEAR);
printf("Starting flash tests 1:\n");
test_flash_1();
int i;
for(i = 0; i < 1024; i++) {
printf("Reboot ...\r");
}
soft_reset();
} else {
printf("Initialization not wished\n");
}
printf("Starting flash tests 2:\n");
test_flash_2();
printf("Starting flash stack tests:\n");
test_flash_stack();
printf("Starting flash blaster tests:\n");
test_flash_blaster();
PROCESS_END();
}