Exemple #1
0
/**
* @brief 写入FLAT文件数据
* @param sector 文件扇区号
* @param buf 缓存区指针
* @param len 缓存区长度
* @return 成功返回实际写入长度, 失败返回-1
*/
int WriteFlatFile(unsigned int sector, const unsigned char *buf, int len)
{
	rec_head_t head;
	int rtn = 0;
	unsigned char memcache[BUFFER_SIZE];	
	unsigned char* pmem = memcache;

	AssertLogReturn(FlatFid<0, -1, "invalid flat id(%d)\n", sector);
	AssertLogReturn(sector >= MAX_SECTOR, -1, "invalid sector(%d)\n", sector);
	AssertLogReturn(len <= 0, -1, "invalid len(%d:%d)\n", sector, len);
	AssertLogReturn(len > REC_DATASIZE(sector), -1, "invalid record size(%d:%d)\n", sector, REC_DATASIZE(sector));

	head.magic = FLAT_MAGIC;
	head.crc = CalculateCRC(buf, len);

	memset(pmem, 0x0, sizeof(memcache));
	memcpy(pmem, (void*)&head, sizeof(head)); pmem += sizeof(head);
	memcpy(pmem, buf, len);

	FLAT_LOCK;
	ioctl(FlatFid, 0, &sector); //选择写入的扇区
	rtn = write(FlatFid, memcache, sizeof(head)+len); 	
	FLAT_UNLOCK;

	//DebugPrint(0, "writeflat id is %d, rtn is %d\n", sector, rtn);
	return rtn;
}
Exemple #2
0
/**
* @brief 读取FLAT文件数据
* @param sector 文件扇区号
* @param buf 缓存区指针
* @param len 缓存区长度
* @return 成功返回实际读取长度, 失败返回-1
*/
int ReadFlatFile(unsigned int sector, unsigned char *buf, int len)
{
	int rtn = 0;
	int rdlen = 0;
	unsigned char memcache[BUFFER_SIZE];	

	AssertLogReturn(FlatFid<0, -1, "invalid flat id\n");
	AssertLogReturn(sector >= MAX_SECTOR, -1, "invalid sector(%d)\n", sector);
	AssertLog(len<=0, "invalid len(%d:%d)\n", sector, len);
	AssertLogReturn(len > REC_DATASIZE(sector), -1, "invalid record size(%d:%d)\n", sector, REC_DATASIZE(sector));

	memset(memcache, 0x0, sizeof(memcache));
	rdlen = len + sizeof(rec_head_t);

	FLAT_LOCK;
	ioctl(FlatFid, 0, &sector); //选择写入的扇区
	rtn = read(FlatFid, (char *)memcache, rdlen); 
	FLAT_UNLOCK;

	if(1 != ValidRecord(memcache, rdlen) || rtn<4)
	{
		DebugPrint(0, "validRecord\n");
		return -1;
	}
	else
	{
		memcpy(buf, memcache+4, len);
		return rtn-4;
	}
}
Exemple #3
0
/**
* @brief ��UART�˿ڷ�������
* @param port �˿ں�, 0~4
* @param buf ���ͻ�����
* @param len ����������
* @param 0�ɹ�, ����ʧ��
*/
int UartSend(unsigned int port, const unsigned char *buf, int len)
{
	int fd;

	AssertLogReturn(port>=UART_PORTNUM, 1, "invalid port(%d)\n", port);
	fd = FidUart[port];
	//printf("UartSend port = %d fd = %d",port,fd);
	AssertLogReturn(-1 == fd, 1, "invalid fid(%d)\n", fd);
	AssertLog(len<=0, "invalid len(%d)\n", len);

	write(fd, (char *)buf, len);

	return 0;
}
Exemple #4
0
/**
* @brief 保存一个BIN文件
* @param file 文件名
* @param magic 文件标识字
* @param buffer 缓存区指针
* @param len 缓存区长度
* @return 成功返回0, 否则失败
*/
int SaveBinFile(const char *file, unsigned long magic, const unsigned char *buffer, int len)
{
	bin_filehead_t head;
	FILE *pf;
	unsigned char *headp;

	//printf("open %s\n", file);

	if((len <= 0) || (len > MAX_FILELEN)) {
		ErrorLog("invalid len(%d)\n", len);
		return 1;
	}
	AssertLogReturn(NULL==file, 1, "null file\n");

	head.magic = magic;
	head.len = len;
	head.datacrc = CalculateCRC(buffer, len);
	headp = (unsigned char *)&(head.datacrc);
	head.headcrc = CalculateCRC(headp, sizeof(head)-2);

	remove(file);
	pf = fopen(file, "wb");
	if(NULL == pf) {
		ErrorLog("can not open %s for write\n", file);
		return 1;
	}

	fwrite(&head, sizeof(head), 1, pf);
	fwrite(buffer, len, 1, pf);

	fclose(pf);

	return 0;
}
Exemple #5
0
/**
* @brief 保存终端参数
* @return 0成功, 否则失败
*/
int SaveParaTerm(void)
{
	int rt;

	rt = para_writeflash_bin(PARA_FILEINDEX_COMB,(unsigned char *)&para_comb,sizeof(para_comb));
	AssertLogReturn(rt==-1,1,"writeflash para_term failed!\n");

	return 0;
}
Exemple #6
0
/**
* @brief 读取一个BIN文件
*    与ReadBinFile不同的是,buffer内容在读取失败的情况下也有可能修改
*    因此需要应用程序分配专门的buffer
*    一般用来读取数据文件
*    操作比ReadBinFile少了内存分配操作, 但增加了数据不安全性, 使用时要小心
* @param file 文件名
* @param magic 文件标识字
* @param buffer Cache缓存区指针
* @param len 缓存区长度
* @return 成功返回实际读取长度,失败返回-1
*/
int ReadBinFileCache(const char *file, unsigned long magic, unsigned char *buffer, int len)
{
	bin_filehead_t head;
	FILE *pf;
	unsigned short crc;

	if((len <= 0) || (len > MAX_FILELEN)) {
		ErrorLog("invalid len(%d)\n", len);
		return -1;
	}
	AssertLogReturn(NULL==file, -1, "null file\n");

	pf = fopen(file, "rb");
	if(NULL == pf) return -1;

	if(fread(&head, sizeof(head), 1, pf) <= 0) {
		ErrorLog("%s file head too short\n", file);
		goto mark_fail;
	}

	if(head.magic != magic) {
		ErrorLog("%s magic invalid(0x%08X)\n", file, head.magic);
		goto mark_fail;
	}

	if(head.len <= 0 || head.len > len) {
		ErrorLog("%s len invalid(%d)\n", file, head.len);
		goto mark_fail;
	}

	crc = CalculateCRC((unsigned char *)&(head.datacrc), sizeof(head)-2);
	if(head.headcrc != crc) {
		ErrorLog("%s head crc erorr(0x%04X, should be 0x%04X)\n", file, head.headcrc, crc);
		goto mark_fail;
	}

	if(fread(buffer, head.len, 1, pf) <= 0) {
		ErrorLog("%s len too long(%d)\n", file, head.len);
		goto mark_fail;
	}

	crc = CalculateCRC(buffer, head.len);
	if(head.datacrc != crc) {
		ErrorLog("%s data crc erorr(0x%04X, should be 0x%04X)\n", file, head.datacrc, crc);
		goto mark_fail;
	}

	if(len > head.len) len = head.len;
	fclose(pf);
	return len;

mark_fail:
	fclose(pf);
	return -1;
}
Exemple #7
0
/**
* @brief 获取数据库的储存文件名
* @param dbid 数据库ID
* @param clock 储存数据库文件时的时钟
* @param filename 返回的文件名
* @return 成功返回0, 否则失败
*/
static int PlMdbFileName(char *filename, unsigned char dbid, dbtime_t dbtime)
{
	AssertLogReturn(dbid > PLMDB_IMP, 1, "invalid dbid(%d)\n", dbid);

	if('m' == PlFileName[dbid][0]) {
		sprintf(filename, PLMDB_SAVEPATH "%s@%02d%02d.db",
						PlFileName[dbid], dbtime.s.year, dbtime.s.month);
	}
	else {
		sprintf(filename, PLMDB_SAVEPATH "%s@%02d%02d%02d.db",
						PlFileName[dbid], dbtime.s.year,dbtime.s.month, dbtime.s.day);
	}

	return 0;
}
Exemple #8
0
/**
* @brief ��UART�˿ڽ�������
* @param port �˿ں�, 0~4
* @param buf ���ջ�����
* @param len ����������
* @return ʧ�ܷ���-1, �ɹ����ؽ��յ����ֽ���, ����0��ʾδ���յ�����
*/
int UartRecv(unsigned int port, unsigned char *buf, int len)
{
	int fd, rtn, i;
	unsigned char *precv;

	AssertLogReturn(port>=UART_PORTNUM, -1, "invalid port(%d)\n", port);
	fd = FidUart[port];

	if(-1 == fd)
	{
		printf("UartRecv............................................");
		printf("port = %d fd = %d",port,fd);
	}
	AssertLogReturn(-1 == fd, -1, "invalid fid(%d)\n", fd);
	AssertLog(len<=0, "invalid len(%d)\n", len);

	if(UartRecvBuffer[port].len <= 0) 
	{
		UartRecvBuffer[port].len = 0;
		UartRecvBuffer[port].head = 0;
		rtn = read(fd, UartRecvBuffer[port].buf, UART_RCVBUF_SIZE);
		if((rtn <=0) || (rtn > UART_RCVBUF_SIZE)) return 0;
		UartRecvBuffer[port].len = rtn;
	}

	if(UartRecvBuffer[port].len > len) rtn = len;
	else rtn = UartRecvBuffer[port].len;

	precv =  &UartRecvBuffer[port].buf[UartRecvBuffer[port].head];
	for(i=0; i<rtn; i++) *buf++ = *precv++;
	//memcpy(buf, &UartRecvBuffer[port].buf[UartRecvBuffer[port].head], rtn);
	UartRecvBuffer[port].len -= rtn;
	UartRecvBuffer[port].head += rtn;

	return rtn;
}
Exemple #9
0
const para_commport_t *GetParaCommPort(unsigned int port)
{
	AssertLogReturn(port>=MAX_COMMPORT, NULL, "invalid port(%d)\n", port);

	return &ParaMixSave.commport[port];
}
Exemple #10
0
/**
* @brief ��ȡUART�˿ڵ��ļ���(pppʹ��)
* @param port �˿ں�, 0~4
* @return ʧ�ܷ���-1, �ɹ������ļ���
*/
int UartGetFid(unsigned int port)
{
	AssertLogReturn(port>=UART_PORTNUM, -1, "invalid port(%d)\n", port);

	return(FidUart[port]);
}
Exemple #11
0
/**
* @brief 读取一个BIN文件
* @param file 文件名
* @param magic 文件标识字
* @param buffer 缓存区指针
* @param len 缓存区长度
* @return 成功返回实际读取长度,失败返回-1
*/
int ReadBinFile(const char *file, unsigned long magic, unsigned char *buffer, int len)
{
	bin_filehead_t head;
	FILE *pf;
	unsigned short crc;
	unsigned char *memcache = NULL;
	int memlen, filelen;

	if((len <= 0) || (len > MAX_FILELEN)) {
		ErrorLog("invalid len(%d)\n", len);
		return -1;
	}
	AssertLogReturn(NULL==file, -1, "null file\n");

	pf = fopen(file, "rb");
	if(NULL == pf) return -1;

	if(fread(&head, sizeof(head), 1, pf) <= 0) {
		ErrorLog("%s file head too short\n", file);
		goto mark_fail;
	}

	if(head.magic != magic) {
		ErrorLog("%s magic invalid(0x%08X)\n", file, head.magic);
		goto mark_fail;
	}

	if(head.len <= 0 || head.len > MAX_FILELEN) {
		ErrorLog("%s len invalid(%d)\n", file, head.len);
		goto mark_fail;
	}

	crc = CalculateCRC((unsigned char *)&(head.datacrc), sizeof(head)-2);
	if(head.headcrc != crc) {
		ErrorLog("%s head crc erorr(0x%04X, should be 0x%04X)\n", file, head.headcrc, crc);
		goto mark_fail;
	}

	if(head.len > MAX_MEMLEN) memlen = MAX_MEMLEN;
	else memlen = head.len;

	memcache = malloc(memlen);
	if(NULL == memcache) {
		ErrorLog("malloc %d bytes fail\n", head.len);
		goto mark_fail;
	}

	crc = 0;
	filelen = head.len;
	while(filelen > 0) {
		if(fread(memcache, memlen, 1, pf) <= 0) {
			ErrorLog("%s len too long(%d)\n", file, head.len);
			goto mark_fail;
		}

		CalculateCRCStep(memcache, memlen, &crc);

		filelen -= memlen;
		if(filelen > 0 && filelen < memlen) memlen = filelen;
	}
	if(head.datacrc != crc) {
		ErrorLog("%s data crc erorr(0x%04X, should be 0x%04X)\n", file, head.datacrc, crc);
		goto mark_fail;
	}

	if(len > head.len) len = head.len;
	if(head.len > MAX_MEMLEN) {
		fseek(pf, sizeof(head), SEEK_SET);
		if(fread(buffer, len, 1, pf) <= 0) {
			ErrorLog("read file error\n");
			goto mark_fail;
		}
	}
	else {
		memcpy(buffer, memcache, len);
	}

	free(memcache);
	fclose(pf);
	return len;

mark_fail:
	if(NULL != memcache) free(memcache);
	fclose(pf);
	return -1;
}