// Callback to handle changes to the root directory. Should be used with vfs_set_file_change_callback static void file_change_handler(const vfs_filename_t filename, vfs_file_change_t change, vfs_file_t file, vfs_file_t new_file_data) { vfs_mngr_printf("vfs_manager file_change_handler(name=%*s, file=%p, change=%i)\r\n", 11, filename, file, change); vfs_user_file_change_handler(filename, change, file, new_file_data); if (VFS_FILE_CHANGED == change) { if (file == file_transfer_state.file_to_program) { stream_type_t stream; uint32_t size = vfs_file_get_size(new_file_data); vfs_sector_t sector = vfs_file_get_start_sector(new_file_data); stream = stream_type_from_name(filename); transfer_update_file_info(file, sector, size, stream); } } if (VFS_FILE_CREATED == change) { stream_type_t stream; if (STREAM_TYPE_NONE != stream_type_from_name(filename)) { // Check for a know file extension to detect the current file being // transferred. Ignore hidden files since MAC uses hidden files with // the same extension to keep track of transfer info in some cases. if (!(VFS_FILE_ATTR_HIDDEN & vfs_file_get_attr(new_file_data))) { stream = stream_type_from_name(filename); uint32_t size = vfs_file_get_size(new_file_data); vfs_sector_t sector = vfs_file_get_start_sector(new_file_data); transfer_update_file_info(file, sector, size, stream); } } } if (VFS_FILE_DELETED == change) { // Unused } }
// Callback to handle changes to the root directory. Should be used with vfs_set_file_change_callback static void file_change_handler(const vfs_filename_t filename, vfs_file_change_t change, vfs_file_t file, vfs_file_t new_file_data) { vfs_user_printf("virtual_fs_user file_change_handler(name=%*s, change=%i)\r\n", 11, filename, change); if (VFS_FILE_CHANGED == change) { if (file == file_transfer_state.file_to_program) { stream_type_t stream; uint32_t size = vfs_file_get_size(new_file_data); vfs_sector_t sector = vfs_file_get_start_sector(new_file_data); vfs_user_printf(" file properties changed, size=%i\r\n", 11, size); stream = stream_type_from_name(filename); transfer_update_file_info(file, sector, size, stream); } } if (VFS_FILE_CREATED == change) { stream_type_t stream; if (!memcmp(filename, daplink_mode_file_name, sizeof(vfs_filename_t))) { if (daplink_is_interface()) { config_ram_set_hold_in_bl(true); } else { // Do nothing - bootloader will go to interface by default } vfs_user_remount(); } else if (!memcmp(filename, "AUTO_RSTCFG", sizeof(vfs_filename_t))) { config_set_auto_rst(true); vfs_user_remount(); } else if (!memcmp(filename, "HARD_RSTCFG", sizeof(vfs_filename_t))) { config_set_auto_rst(false); vfs_user_remount(); } else if (!memcmp(filename, "ASSERT ACT", sizeof(vfs_filename_t))) { // Test asserts util_assert(0); } else if (!memcmp(filename, "REFRESH ACT", sizeof(vfs_filename_t))) { // Remount to update the drive vfs_user_remount(); } else if (STREAM_TYPE_NONE != stream_type_from_name(filename)) { stream = stream_type_from_name(filename); uint32_t size = vfs_file_get_size(new_file_data); vfs_user_printf(" found file to decode, type=%i\r\n", stream); vfs_sector_t sector = vfs_file_get_start_sector(new_file_data); transfer_update_file_info(file, sector, size, stream); } } if (VFS_FILE_DELETED == change) { if (!memcmp(filename, assert_file, sizeof(vfs_filename_t))) { util_assert_clear(); } } }