mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 09:01:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
 | 
						|
# SPDX-License-Identifier: Apache-2.0
 | 
						|
 | 
						|
from .cluster import Cluster
 | 
						|
from .exceptions import NoFreeClusterException
 | 
						|
from .fatfs_state import FATFSState
 | 
						|
 | 
						|
 | 
						|
class FAT:
 | 
						|
    """
 | 
						|
    The FAT represents the FAT region in file system. It is responsible for storing clusters
 | 
						|
    and chaining them in case we need to extend file or directory to more clusters.
 | 
						|
    """
 | 
						|
    def __init__(self,
 | 
						|
                 fatfs_state: FATFSState,
 | 
						|
                 reserved_sectors_cnt: int) -> None:
 | 
						|
        self.fatfs_state = fatfs_state
 | 
						|
        self.reserved_sectors_cnt = reserved_sectors_cnt
 | 
						|
 | 
						|
        self.clusters = [Cluster(cluster_id=i, fatfs_state=self.fatfs_state) for i in
 | 
						|
                         range(1, self.fatfs_state.max_clusters)]
 | 
						|
 | 
						|
        # update root directory record
 | 
						|
        self.clusters[0].allocate_cluster()
 | 
						|
        # add first reserved cluster
 | 
						|
        self.clusters = [Cluster(cluster_id=Cluster.RESERVED_BLOCK_ID, fatfs_state=self.fatfs_state)] + self.clusters
 | 
						|
 | 
						|
    def find_free_cluster(self) -> Cluster:
 | 
						|
        # finds first empty cluster and allocates it
 | 
						|
        for cluster in self.clusters:
 | 
						|
            if cluster.is_empty:
 | 
						|
                cluster.allocate_cluster()
 | 
						|
                return cluster
 | 
						|
        raise NoFreeClusterException('No free cluster available!')
 | 
						|
 | 
						|
    def allocate_chain(self, first_cluster: Cluster, size: int) -> None:
 | 
						|
        current = first_cluster
 | 
						|
        for _ in range(size - 1):
 | 
						|
            free_cluster = self.find_free_cluster()
 | 
						|
            current.next_cluster = free_cluster
 | 
						|
            current.set_in_fat(free_cluster.id)
 | 
						|
            current = free_cluster
 |