2021-12-06 17:17:20 +00:00
|
|
|
# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
2021-09-21 22:32:54 +00:00
|
|
|
# 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
|
2021-12-06 17:17:20 +00:00
|
|
|
range(1, self.fatfs_state.clusters)]
|
2021-09-21 22:32:54 +00:00
|
|
|
|
|
|
|
# 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
|