/*RTM_FileMng.c ---- RTM8000公共底层构件之 文件管理 【严禁修改】---------**
** ┏┯┯┯┯┯┯┯┯┯┯┓┏┯┯┯┯┯┯┯┯┓┏┯┯┓ XATU ** 雷 斌 **
** ┠RTM8000 远程测控系统┨┠文件管理相关函数┨┠说明┨ V1.0 ** 吕志刚 **
** ┗┷┷┷┷┷┷┷┷┷┷┛┗┷┷┷┷┷┷┷┷┛┗┷┷┛ 090623 ** 王 建 **
**-----------------------------------------------------------------------**
**【作用与功能】 提供文件的建立、打开、追加、删除、关闭等功能,与硬件无关
**-----------------------------------------------------------------------**
* 文件模式适用于存放测量记录数据和日志等大量的、不定长的、无固定格式的数据
*------------------------------------------------------------------------**
【文件模式的存储管理原理】
* 文件由文件编号、文件索引表、文件数据等几部分组成。
其中0号文件为日志文件、1/2号文件为系统文件、3到18号文件为测量数据文件
每个文件编号对应一个文件索引表;
文件索引表内包括文件名、创建时间、文件长度、文件存储的起始页和终止页等
起始页到终止页指明文件存储在FLASH中的页地址编号
*------------------------------------------------------------------------**
【文件管理的主要流程】
1:初始化时,文件相关的全局变量将从配参表中读出 fnFileSysParaNew
2:有追加的数据时,直接调用 fnFileAppend 函数追加到文件缓冲区;
该函数将区分文件编号以决定追加到日志文件缓冲区还是测量数据文件缓冲区
3:在空闲时候或缓冲区满时,将调用fnFileUpdate将I2C缓冲中的数据写入Flash
4:如果当前未打开文件(打开文件的文件编号为255),则追加会新建文件
5:文件关闭时才计算文件的大小等,并修改记录文件索引表
6:文件读取时先根据最小最大和空文件编号决定有多少个要提取的记录文件,
然后读取该编号的文件索引表,然后解析文件索引表得到FLASH页,然后逐页提取
4.1.1【文件读取】
程序指定文件编号,查找文件索引表的获得文件名及存放位置等信息,然后读取文件。
*------------------------------------------------------------------------**
【文件存储的过程】
文件首先被打开才能写入(追加)数据;
写入文件的数据首先被保存在I2C存储器的一个文件缓冲区中;
仅当I2C中的文件缓冲区内有一页FLASH以上的数据量时,数据才会被写入FLASH
*------------------------------------------------------------------------**
【对上位机文件提取作业的建议】
1:大文件可能一次传不完,最好能断点续传:记录已经读取的数据在一个临时文件中,
下次仅提取那些没有提取的FLASH页,以方便大文件的传输。
2:
*------------------------------------------------------------------------**
**注意:所有文件相关函数不能调低级别显示等因其可能引起写文件操作而造成嵌套
[调用函数] fnCfgParaGet fnCfgParaWrite fnI2CSerMemWritet fnI2CSerMemRead
**========================================================================
a_index()【文件组成索引】[详细说明见后--双击该部分文字,然后点F3即可]
// ----------------------------------
//--1 通信协议中测站文件管理类指令 ---------------------------------------*
// ----------------------------------
// ----------------------------------
//--2 文件管理系统相关思路 -----------------------------------------------*
// ----------------------------------
// ----------------------------------
//--3 修订记录 -----------------------------------------------------------*
// ----------------------------------
3.8 测站文件管理类指令 FX ――VQIT080814新增
//--- V1版文件索引表结构
4.1 文件系统功能设计
4.1.2 追加一个(记录)文件
指明下一个空文件编号(存储指针),按照文件信息填写文件索引表,然后写入文件内容到分配的存储器页面。具体流程如下:
4.1.3 删除文件
为保证文件存放连续,只能从最后一个文件开始删除;提供删除所有文件属性标记为读写的文件。
4.1.4 远程文件读取
1:获取记录文件编号――以确定哪些文件是需要读取的文件;
2:读取指定文件编号的文件索引表以获得文件名及存放位置等信息;
3:逐个页面读取文件各部分;
4:拚装文件。
4.1.5 远程改写一个文件
远程改写文件必须确保文件大小与原先占用存储器的区域不变,即索引表中除文件名、建立时间等外与原文件索引表内容一致。
1:指定文件编号修改文件索引表;
2:下传文件的一个页,终端改写,直到所有页改写完成。
4.1.6 远程删除文件
为保证文件存放连续,只能从最后一个文件开始删除;提供删除所有记录文件功能。
4.2 文件系统远程访问协议――详见《RTM8000 通信协议080820》
通信协议中测站文件管理类指令
1 提取指定文件编号的数据(文件)索引表 F0h SCmdPickUpIndex
2 提取指定文件编号的文件索引表的应答:F1h fnRspPickUpIndex
3 提取指定文件名的文件索引表 F2h ScmdPickUpFileIndex2
4 改写指定编号文件索引表 F3h SCmdCreateFileIndex
5 提取指定存储器页(扇区)内容 F4h SCmdReadMemPage
6 提取指定存储器页(扇区)内容的响应 F5h SRspReadMemPage
7 改写指定存储器页(扇区)内容 F6h SCmdWriteMemPage
8 改写指定存储器页(扇区)内容的响应―ACK或NAK
9 提取记录文件的编号指针 F8h SCmdPickUpRcdFilePoint
10 提取记录文件编号指针的响应 F9h SRspPickUpRcdFilePoint
4.3 文件管理的基本思路
受硬件制约的内存分配原因,文件索引表的大小是固定的、故文件编号的最大值是固定的。
文件存放的存储器大小是固定的,但由于文件大小不定,文件数量可以较大。
由此,文件索引表的容量应大于文件能够存取的大小。
4.3.1 文件编号
内部使用,用以对应到文件索引表。给每个文件一个号码,记录占用其中的一部分(从指定号码开始,到最大记录数为止。)
将固定的文件(系统文件)安排在0开始的文件编号,活动文件(记录文件)安排在后面。记录文件的编号范围由配参给出。在所有系统中,0号文件为日志文件
VQIT中文件编号分配如下:除0号文件为外
0:日志文件
1:样本语音1(HW8.wav)
2:样本语音2
3~40:记录文件
4.3.2 文件索引表
文件索引表存放在由配参指明的存储器编号和页号中。
对于存放在FM24CL64的1800开始,则存储器编号为31,页号为30h。
获得30h这个页号后,而31号存储器的页大小为128字节(7位二进制),将30h作为存储器地址的高位,后面再加上7个0(二进制,相当于乘以128),得到索引表在存储器中存放的起始地址。
对于指定文件编号的索引表,将文件编号乘以索引表长度(由版本号确定),加上索引表起始地址即可获得该编号文件的索引表存储地址。
4.3.3 V1版文件索引表结构
V1版文件索引表的结构,详见下述结构:
struct SFileIndex //38字节
{
unsigned char cFileName[16]; //文件名 16
unsigned char cFileExp[3]; //文件扩展名-类型 3
// 日志文件名为T3305_1208281841.Log 设备编号_创建时间,扩展名为log。
// 在VQIT系统中,TopID[8];//主任务ID cSubID[8];//子任务ID
// VQIT主叫音频文件vmt 被叫音频文件名vst wav格式,必须要有wav格式头
// VQIT主叫网络参数文件nmt 被叫网络参数文件nst 文件格式是XML文档
// RTT地温等测量数据文件 T3305_0812062011.Rcd
//多路高速数据采集文件.WAV后缀 按照wav格式,必须要有wav格式头
unsigned char cFileAttribute; //文件属性 1
//00H(读写)01H(只读)02H(隐藏)04H(系统)08H(卷标)10H(子目录)
//20H(归档——只要完成了写操作并已关闭,则该位置1)80h已删除 该字段位操作
struct SDateTime SCreateTime[8]// 文件建立时间,时间格式,8字节
unsigned long lFileLength; //32位的文件字节长度 4
unsigned int iMemoryNum; //存储器编号 2
unsigned int iStartPage; //起始页号(扇区) 2
unsigned int iSumPage; //记录文件总页数 2
};
【记录索引表的存储】48字节每个计算:2K字节可存42条文件索引表。
【记录号的约定】VQIT中,
0000~001Fh号用以存储测试记录(32个记录文件,最少16次测量-网参文件+语音文件)
0020~0029h 用以存放参考语音。
4.3.4 文件本体
文件本体存放在索引表指明的存储器编号的指定页号范围中。
文件本体的读取或写入按照页进行。
========================================================================
// ----------------------------------
//--1 通信协议中测站文件管理类指令 ---------------------------------------*
// ----------------------------------
详见《RTM8000 通信协议》
3.8 测站文件管理类指令 FX ――VQIT080814新增
下面的帧用于中心对监测终端文件、数据、内存的全面读写。
F0h:提取指定记录号的记录(文件)索引表――包括添加记录时的设备运行数据
F1h:F0命令的响应
F2h:提取指定文件名的文件索引表―
F3h:追加一个指定记录号的文件索引表
F4h:读取串行Flash指定页
F5h:F4命令(读取串行Flash指定页)的响应
F6h:改写串行Flash指定页内容
ACK 或 NAK:F6命令(改写串行Flash指定页)的响应
VQIT中不设计自动上报功能――以后自动上报在B类型中。
3.8.1 提取指定文件编号的文件索引表 F0h SCmdPickUpIndex
当中心需要提取指定的记录文件数据时,先提取记录文件索引表,然后再根据索引指