basic/buffer_dump/buffer_dump.c

See examples/basic/buffer-dump

/*
* ZentriOS SDK LICENSE AGREEMENT | Zentri.com, 2015.
*
* Use of source code and/or libraries contained in the ZentriOS SDK is
* subject to the Zentri Operating System SDK license agreement and
* applicable open source license agreements.
*
*/
/* Documentation for this app is available online.
* See https://docs.zentri.com/wifi/sdk/latest/examples/basic/buffer-dump
*/
#include "zos.h"
// unused, placeholder
ZOS_GETTERS_START(buffer_dump)
// unused, placeholder
ZOS_SETTERS_START(buffer_dump)
/*************************************************************
* Commands List
*/
ZOS_COMMANDS_START(buffer_dump)
ZOS_ADD_COMMAND("?", 0, 0, ZOS_FALSE, print_help),
ZOS_ADD_COMMAND("dump", 0, 12, ZOS_FALSE, dump_buffer)
ZOS_COMMAND_LISTS(buffer_dump);
/*************************************************************************************************/
void zn_app_init(void)
{
ZOS_LOG("Buffer Dump App ready");
__zos_cmd_print_help_command(0, NULL);
}
/*************************************************************************************************/
void zn_app_deinit(void)
{
}
/*************************************************************************************************/
zos_bool_t zn_app_idle(void)
{
return ZOS_TRUE;
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(print_help)
{
ZOS_LOG("Usage:");
ZOS_LOG("Dump a dummy buffer with specified formatting");
ZOS_LOG("> dump [-r <1-32>] [-w <1-4] [-s <0/1>] [-a <0/1>] [-c <0/1>] [-e <b/l>] [-l <1-1024>]");
ZOS_LOG("where:");
ZOS_LOG("-r <1-32> : Number of words per row: 1,2,4,8,16,32. Default: 8");
ZOS_LOG("-w <1-4> : Bytes per word: 1,2,4. Default: 4");
ZOS_LOG("-s <0/1> : Add space between words. Default: 1");
ZOS_LOG("-a <0/1> : Print addresses. Default: 1");
ZOS_LOG("-c <0/1> : Print row ascii. Default: 1");
ZOS_LOG("-e <b/l> : Word endianess, b = big, l = little. Default: little");
ZOS_LOG("-l <1-1024> : Size of dummy buffer. Default: 128 bytes");
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(dump_buffer)
{
uint16_t dump_size = 128;
uint32_t dump_flags = ZOS_DUMP_FLAGS(8, 4, LITTLE, ADD_SPACE, PRINT_ADDRESSES, PRINT_ASCII);
for(; argc > 0; argc -= 2, argv += 2)
{
if(argc < 2 || argv[0][0] != '-')
{
return CMD_BAD_ARGS;
}
switch(argv[0][1])
{
case 'l': {
ZOS_CMD_PARSE_INT_ARG_WITH_VAR(uint16_t, dump_size, argv[1], 1, 1024);
} break;
case 'r': {
ZOS_CMD_PARSE_INT_ARG(uint8_t, row_len, argv[1], 1, 32);
dump_flags &= ~ZOS_DUMP_ROW_MASK;
dump_flags |= (log2_uint32(row_len) << ZOS_DUMP_ROW_LEN_OFFSET);
} break;
case 'w': {
ZOS_CMD_PARSE_INT_ARG(uint8_t, word_len, argv[1], 1, 4);
dump_flags &= ~ZOS_DUMP_WORD_LEN_MASK;
dump_flags |= (log2_uint32(word_len) << ZOS_DUMP_WORD_LEN_OFFSET);
} break;
case 's': {
dump_flags &= ~ZOS_DUMP_SPACE_MASK;
dump_flags |= ((argv[1][0] == '1') << ZOS_DUMP_SPACE_OFFSET);
} break;
case 'a': {
dump_flags &= ~ZOS_DUMP_ADDRESS_MASK;
dump_flags |= ((argv[1][0] == '1') << ZOS_DUMP_ADDRESS_OFFSET);
} break;
case 'c': {
dump_flags &= ~ZOS_DUMP_ASCII_MASK;
dump_flags |= ((argv[1][0] == '1') << ZOS_DUMP_ASCII_OFFSET);
} break;
case 'e': {
dump_flags &= ~ZOS_DUMP_ENDIAN_MASK;
dump_flags |= ((argv[1][0] == 'b') << ZOS_DUMP_ENDIAN_OFFSET);
} break;
}
}
char *buffer;
zn_malloc((uint8_t**)&buffer, dump_size);
char *ptr = buffer;
char c = 32;
for(int remaining = dump_size; remaining > 0; --remaining)
{
*ptr++ = c++;
if(c == 127)
c = 32;
}
ZOS_LOG("Flags: %03X", dump_flags);
zn_dump_buffer(buffer, dump_size, "Buffer dump", dump_flags);
zn_free(buffer);
}