file/file_list/main.c

/*******************************************************************************
* # License
* Copyright 2019 Silicon Laboratories Inc. www.silabs.com
*******************************************************************************
*
* The licensor of this software is Silicon Laboratories Inc. Your use of this
* software is governed by the terms of Silicon Labs Master Software License
* Agreement (MSLA) available at
* www.silabs.com/about-us/legal/master-software-license-agreement. This
* software is distributed to you in Source Code format and is governed by the
* sections of the MSLA applicable to Source Code.
*
******************************************************************************/
/*
* Documentation for this app is available online.
* See https://docs.silabs.com/gecko-os/4/standard/latest/sdk/examples/file/file-list
*/
#include "gos.h"
#define APPLICATION_START_LINE "\r\n\r\nFile Listing example app starting ..."
/*************************************************************************************************/
void gos_app_init(void)
{
GOS_LOG(APPLICATION_START_LINE);
display_file_stats();
list_extended_files_only();
list_webapp_files();
list_with_paging();
GOS_LOG("Done");
}
/*************************************************************************************************/
static void display_file_stats(void)
{
gos_result_t result;
{
GOS_LOG("Failed to get file stats: %d", result);
return;
}
GOS_LOG("File count....... %u", stats.file_count);
GOS_LOG("Flash size....... %u", stats.total_size);
GOS_LOG("Bytes used....... %u", stats.bytes_used);
GOS_LOG("Bytes available.. %u", stats.bytes_available);
}
/*************************************************************************************************/
static void list_extended_files_only(void)
{
gos_result_t result;
gos_file_t *file_list;
GOS_LOG("\r\nListing files on extended flash...");
if (GOS_FAILED(result, gos_file_list(&params, &file_list, NULL, NULL)))
{
GOS_LOG("Failed to get file listing: %d", result);
return;
}
print_file_list(file_list);
}
/*************************************************************************************************/
static void list_webapp_files(void)
{
gos_result_t result;
gos_file_t *file_list;
params.filter.name = "webapp/*";
GOS_LOG("\r\nListing webapp files...");
if (GOS_FAILED(result, gos_file_list(&params, &file_list, NULL, NULL)))
{
GOS_LOG("Failed to get file listing: %d", result);
return;
}
print_file_list(file_list);
}
/*************************************************************************************************/
static void list_with_paging(void)
{
gos_result_t result;
gos_file_t *file_list;
params.page.limit = 5; // Only return at most 5 files per list
params.page.offset = 0; // Start searching at sector 0
GOS_LOG("\r\nListing files on extended flash with 'paging' ...");
for (int i = 1;; ++i)
{
if (GOS_FAILED(result, gos_file_list(&params, &file_list, NULL, NULL)))
{
GOS_LOG("Failed to get file listing: %d", result);
return;
}
else if (file_list == NULL)
{
break;
}
GOS_LOG("Page: %d", i);
// Update the offset to the NEXT sector after the last file in the list
params.page.offset = print_file_list(file_list) + 1;
}
}
/*************************************************************************************************/
static uint32_t print_file_list(const gos_file_t *file_list)
{
uint32_t max_sector = 0;
if (file_list == NULL)
{
GOS_LOG("No files found!");
}
else
{
GOS_LOG(" # Name Handle Size Checksum");
int i = 0;
for (const gos_file_t *file = file_list; file != NULL; file = file->next, ++i)
{
char buffer[128];
char *ptr = buffer;
ptr += sprintf(ptr, "%2d ", i);
ptr += sprintf(ptr, "%32s ", file->name);
ptr += sprintf(ptr, "%6u ", (unsigned int)GOS_FILE_HANDLE_SECTOR(file->handle));
ptr += sprintf(ptr, "%7u ", (unsigned int)file->size);
ptr += sprintf(ptr, "%08X", (unsigned int)file->checksum);
GOS_LOG("%s", buffer);
if (max_sector < GOS_FILE_HANDLE_SECTOR(file->handle))
{
max_sector = GOS_FILE_HANDLE_SECTOR(file->handle);
}
}
}
return max_sector;
}