uint16 as_create_cyclic(asgard_handle * handle, uint16 fid, uchar ACC_READ, uchar ACC_WRT, uchar ACC_INC, uchar ACC_INV, uchar ACC_RHB, uchar total_rec, uchar rec_size) { ef_rec_header header; uchar * buffer; uchar i; fs_file * file = as_get_current_directory(handle); //get currently selected directory if(file == NULL) return APDU_NO_EF_SELECTED; if((file->entry.type & FS_TYPE_DIR) == 0) return APDU_COMMAND_INVALID; header.structure = EF_CYCLIC; header.status = EF_VALID; header.access_rw = ACC_READ << 4 | ACC_WRT; header.access_inc = ACC_INC; header.access_ri = ACC_RHB << 4 | ACC_INV; header.num_of_records = total_rec; header.rec_size = rec_size; header.first = 0; file = fs_fcreate(file, fid, handle->mode); fs_fwrite(file, &header, sizeof(ef_rec_header)); //write header first buffer = (uchar *)malloc(rec_size); memset(buffer, 0xff, rec_size); for(i=0;i<total_rec;i++) { fs_fwrite(file, buffer, rec_size); } free(buffer); as_set_current_file(handle, file); //automatically select new file return APDU_SUCCESS; }
uint16 as_create_binary(asgard_handle * handle, uint16 fid, uchar ACC_READ, uchar ACC_WRT, uchar ACC_INC, uchar ACC_INV, uchar ACC_RHB, uchar * buffer, uint16 size) { ef_bin_header header; fs_file * file = as_get_current_directory(handle); //get currently selected directory if(file == NULL) return APDU_NO_EF_SELECTED; if((file->entry.type & FS_TYPE_DIR) == 0) return APDU_COMMAND_INVALID; header.structure = EF_TRANSPARENT; header.size = size; header.status = EF_VALID; header.access_rw = ACC_READ << 4 | ACC_WRT; header.access_inc = ACC_INC; header.access_ri = ACC_RHB << 4 | ACC_INV; file = fs_fcreate(file, fid, handle->mode); fs_fwrite(file, &header, sizeof(ef_bin_header)); //write header first fs_fwrite(file, buffer, size); //write content (should i write content first to default??) as_set_current_file(handle, file); //automatically select new file return APDU_SUCCESS; }
//uint16 _write_new_rec(uint16 rec_no, uchar size, uchar *buffer); uint16 as_write_record(asgard_handle * handle, uint16 rec_no, uchar *buffer, uchar size) { ef_rec_header header; fs_file * file = as_get_current_file(handle); uchar bytes_wrote; uint16 offset; //uchar actual_index; if(file == NULL) return APDU_NO_EF_SELECTED; if(file->entry.type & FS_TYPE_DIR) return APDU_COMMAND_INVALID; fs_fseek(file, 0); fs_fread(file, &header, sizeof(ef_rec_header)); //getting ef information from ef header first if(header.structure == EF_LINFIX || header.structure == EF_CYCLIC) { return APDU_INSTRUCTION_INVALID; //wrong command } if(header.status != EF_VALID) { return APDU_INVALID_STATUS; } if(size != header.rec_size) return APDU_OUT_OF_RANGE; //check for record size if(header.structure == EF_LINFIX) { //read operation for linier fixed offset = sizeof(ef_rec_header) + (header.rec_size * rec_no); //calculate offset for linier fixed handle->cur_rec_index = rec_no; //update handle current record fs_fseek(file, offset); bytes_wrote = fs_fwrite(file, buffer, header.rec_size); if(bytes_wrote == header.rec_size) return APDU_SUCCESS; //return APDU_FATAL_ERROR; } else if(header.structure == EF_CYCLIC) { //read operation for cyclic if(rec_no == 0xffff) rec_no = header.num_of_records - 1; //check if rec_no is negative rec_no = ((rec_no + header.first) % header.num_of_records); //calculate modded record number handle->cur_rec_index = rec_no; //update handle current record offset = sizeof(ef_rec_header) + (header.rec_size * rec_no); //calculate offset for cyclic fs_fseek(file, offset); bytes_wrote = fs_fwrite(file, buffer, header.rec_size); if(bytes_wrote == header.rec_size) { header.first = rec_no; fs_fseek(file, 0); fs_fwrite(file, &header, sizeof(ef_rec_header)); //set new ef information //handle->cur_rec_index = 0; //should current record index set to 0 for relative positioning return APDU_SUCCESS; } //return APDU_FATAL_ERROR; } return APDU_FATAL_ERROR; }
//ethan_20110801_add ER Cal_SaveAWBGS(void) { ER ercode = 0; FLGPTN uiFlag = 0; HNVT_FILE *pFile; Cal_ClearOSD(_OSD_INDEX_TRANSPART); if(AAA_Adjust.AWB_Status == _AWB_Status) { AAA_Adjust.AWBGS_Status = _AWB_Status; AAA_Adjust.AWBGS.Rgain = AAA_Adjust.AWB.Rgain; AAA_Adjust.AWBGS.Bgain = AAA_Adjust.AWB.Bgain; sprintf(CalStringBuffer,"AWB GS: Rgain:%d Bgain:%d",AAA_Adjust.AWBGS.Rgain,AAA_Adjust.AWBGS.Bgain); Cal_ShowStringWithColor(CalStringBuffer,20, 100, 4); ercode = E_OK; } else ercode = E_SYS; sprintf(CalStringBuffer,"Press SHUTTER to return"); Cal_ShowStringWithColor(CalStringBuffer,20, 120, 4); if(ercode == E_OK) { FilesysWaitCmdFinish(FST_TIME_INFINITE); pFile = fs_fopen("A:\\AWBGS.txt","w"); if(pFile == NULL) { sprintf(CalStringBuffer, "create AWBGS.txt fail"); Cal_ShowStringWithColor(CalStringBuffer,20, 40, 4); TimerDelayMs(2000); } else { sprintf(CalStringBuffer, "%d %d",AAA_Adjust.AWBGS.Rgain,AAA_Adjust.AWBGS.Bgain); fs_fwrite(CalStringBuffer, 1, 7, pFile); fs_fclose(pFile); g_CalStringRect.uiLeft = 20; g_CalStringRect.uiTop = 200; g_CalStringRect.uiWidth = 300; g_CalStringRect.uiHeight = 30; sprintf(CalStringBuffer, "AWBGS.txt OK"); Cal_ShowStringWithColor(CalStringBuffer,20, 40, 4); TimerDelayMs(2000); } Cal_WriteCalData(PSTORE_SEC_SENSOR); } clr_flg(FLG_ID_KEY, FLGKEY_SHUTTER2); wai_flg(&uiFlag, FLG_ID_KEY, FLGKEY_SHUTTER2, TWF_ORW | TWF_CLR); return ercode; }
/* rehabilitate currently selected file */ uint16 as_rehabilitate(asgard_handle * handle) { ef_bin_header header; //standard ef header uchar bytes_wrote = 0; fs_file * file = as_get_current_file(handle); if(file == NULL) return APDU_NO_EF_SELECTED; fs_fseek(file, 0); fs_fread(file, &header, sizeof(ef_bin_header)); //getting ef information from ef header first if((header.status & EF_VALID) == 0) { return APDU_INVALID_STATUS; } header.status |= EF_VALID; fs_fseek(file, 0); bytes_wrote = fs_fwrite(file, &header, sizeof(ef_bin_header)); //set new ef information if(bytes_wrote != sizeof(ef_bin_header)) return APDU_FATAL_ERROR; return APDU_SUCCESS; }
uint16 as_write_binary(asgard_handle * handle, uint16 offset, uchar * buffer, uchar size) { ef_bin_header header; fs_file * file = as_get_current_file(handle); if(file == NULL) return APDU_NO_EF_SELECTED; if(file->entry.type & FS_TYPE_DIR) return APDU_COMMAND_INVALID; fs_fseek(file, 0); fs_fread(file, &header, sizeof(ef_bin_header)); //getting ef information from ef header first if(header.structure == EF_TRANSPARENT) { return APDU_INSTRUCTION_INVALID; //wrong command } if(header.status != EF_VALID) { return APDU_INVALID_STATUS; } if(offset + size <= (header.size + sizeof(ef_bin_header))) { fs_fseek(file, offset + sizeof(ef_bin_header)); fs_fwrite(file, buffer, size); return APDU_SUCCESS; //read success } return APDU_OUT_OF_RANGE; //wrong offset and length }