文件系统随机打开文件
File System Open Files Randomly
我的一位客户要求我播放 SD 卡中的声音。但是文件 selection 应该是随机的,因为该设备是用来吓唬野外动物的(动物不应该习惯声音模式)。我可以通过
生成随机数
void RNG_Generate_Numbers()
{
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number1);
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number2);
}
而且我可以通过
统计文件
void File_Find_File(file_manager_t *file_manage)
{
file_manage->file_result = f_readdir(&file_manage->file_direction, &file_manage->file_info);
if( (file_manage->file_result != FR_OK) || (file_manage->file_info.fname[0] == '[=11=]') )
{
file_manage->file_counter = 0;
}
else
{
++file_manage->file_counter;
}
}
到这里为止一切都很好。但是当它随机涉及 select 个文件时,我找不到任何方法来做到这一点。感谢任何帮助。
编辑:这是 file_manager 结构;
typedef struct __file_manager /* struct tag */
{
FATFS drive_handler;
FIL file_handler;
FRESULT file_result;
uint8_t file_disk_status;
DIR file_direction;
FILINFO file_info;
uint8_t file_rx_buffer[512];
char file_current_dir[256];
uint32_t file_bytes_read;
uint32_t file_bytes_write;
size_t file_counter;
}file_manager_t ;
最简单的解决方案是将所有文件移动到一个目录中,并按从零开始的顺序命名每个文件。获得一个随机文件名就很简单了:
sprintf(file_name, "%d.mp3", rand() % my_files);
我的一位客户要求我播放 SD 卡中的声音。但是文件 selection 应该是随机的,因为该设备是用来吓唬野外动物的(动物不应该习惯声音模式)。我可以通过
生成随机数void RNG_Generate_Numbers()
{
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number1);
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number2);
}
而且我可以通过
统计文件void File_Find_File(file_manager_t *file_manage)
{
file_manage->file_result = f_readdir(&file_manage->file_direction, &file_manage->file_info);
if( (file_manage->file_result != FR_OK) || (file_manage->file_info.fname[0] == '[=11=]') )
{
file_manage->file_counter = 0;
}
else
{
++file_manage->file_counter;
}
}
到这里为止一切都很好。但是当它随机涉及 select 个文件时,我找不到任何方法来做到这一点。感谢任何帮助。
编辑:这是 file_manager 结构;
typedef struct __file_manager /* struct tag */
{
FATFS drive_handler;
FIL file_handler;
FRESULT file_result;
uint8_t file_disk_status;
DIR file_direction;
FILINFO file_info;
uint8_t file_rx_buffer[512];
char file_current_dir[256];
uint32_t file_bytes_read;
uint32_t file_bytes_write;
size_t file_counter;
}file_manager_t ;
最简单的解决方案是将所有文件移动到一个目录中,并按从零开始的顺序命名每个文件。获得一个随机文件名就很简单了:
sprintf(file_name, "%d.mp3", rand() % my_files);