/** * @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, §or); //选择写入的扇区 rtn = write(FlatFid, memcache, sizeof(head)+len); FLAT_UNLOCK; //DebugPrint(0, "writeflat id is %d, rtn is %d\n", sector, rtn); return rtn; }
/** * @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, §or); //选择写入的扇区 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; } }
/** * @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; }
/** * @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; }
/** * @brief 保存终端参数 * @return 0成功, 否则失败 */ int SaveParaTerm(void) { int rt; rt = para_writeflash_bin(PARA_FILEINDEX_COMB,(unsigned char *)¶_comb,sizeof(para_comb)); AssertLogReturn(rt==-1,1,"writeflash para_term failed!\n"); return 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; }
/** * @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; }
/** * @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; }
const para_commport_t *GetParaCommPort(unsigned int port) { AssertLogReturn(port>=MAX_COMMPORT, NULL, "invalid port(%d)\n", port); return &ParaMixSave.commport[port]; }
/** * @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]); }
/** * @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; }