1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/****************************************************************************** 2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * $Id: AKFS_FileIO.c 580 2012-03-29 09:56:21Z yamada.rj $ 3ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ****************************************************************************** 4ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 5ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Copyright (C) 2012 Asahi Kasei Microdevices Corporation, Japan 6ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 7ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Licensed under the Apache License, Version 2.0 (the "License"); 8ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * you may not use this file except in compliance with the License. 9ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * You may obtain a copy of the License at 10ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 11ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * http://www.apache.org/licenses/LICENSE-2.0 12ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 13ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Unless required by applicable law or agreed to in writing, software 14ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * distributed under the License is distributed on an "AS IS" BASIS, 15ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * See the License for the specific language governing permissions and 17ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * limitations under the License. 18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_FileIO.h" 20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*** Constant definition ******************************************************/ 22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef AKFS_PRECISION_DOUBLE 23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define AKFS_SCANF_FORMAT "%63s = %lf" 24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#else 25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define AKFS_SCANF_FORMAT "%63s = %f" 26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define AKFS_PRINTF_FORMAT "%s = %f\n" 28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define LOAD_BUF_SIZE 64 29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Load parameters from file which is specified with #path. This function reads 32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda data from a beginning of the file line by line, and check parameter name 33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sequentially. In otherword, this function depends on the order of eache 34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda parameter described in the file. 35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If function fails, the return value is #AKM_FAIL. When function fails, 36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the output is undefined. Therefore, parameters which are possibly overwritten 37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda by this function should be initialized again. If function succeeds, the 38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return value is #AKM_SUCCESS. 39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] prms A pointer to #AK8975PRMS structure. Loaded parameter is 40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda stored to the member of this structure. 41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] path A path to the setting file. 42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16 AKFS_LoadParameters(AK8975PRMS * prms, const char* path) 44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int16 ret; 46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda char buf[LOAD_BUF_SIZE]; 47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda FILE *fp = NULL; 48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Open setting file for read. */ 50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((fp = fopen(path, "r")) == NULL) { 51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR_STR("fopen"); 52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_FAIL; 53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 1; 56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Load data to HO */ 58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fscanf(fp, AKFS_SCANF_FORMAT, buf, &prms->mfv_ho.u.x) != 2) { 59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (strncmp(buf, "HO.x", sizeof(buf)) != 0) { 62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fscanf(fp, AKFS_SCANF_FORMAT, buf, &prms->mfv_ho.u.y) != 2) { 66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (strncmp(buf, "HO.y", sizeof(buf)) != 0) { 69ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fscanf(fp, AKFS_SCANF_FORMAT, buf, &prms->mfv_ho.u.z) != 2) { 73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 75ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (strncmp(buf, "HO.z", sizeof(buf)) != 0) { 76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 80ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fclose(fp) != 0) { 81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR_STR("fclose"); 82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (ret == 0) { 86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR; 87ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_FAIL; 88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_SUCCESS; 91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 92ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Save parameters to file which is specified with #path. This function saves 95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda variables when the offsets of magnetic sensor estimated successfully. 96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If function fails, the return value is #AKM_FAIL. When function fails, 97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the parameter file may collapsed. Therefore, the parameters file should be 98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda discarded. If function succeeds, the return value is #AKM_SUCCESS. 99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] prms A pointer to #AK8975PRMS structure. Member variables are 100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda saved to the parameter file. 101ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] path A path to the setting file. 102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16 AKFS_SaveParameters(AK8975PRMS *prms, const char* path) 104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int16 ret = 1; 106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda FILE *fp; 107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 108ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /*Open setting file for write. */ 109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((fp = fopen(path, "w")) == NULL) { 110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR_STR("fopen"); 111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_FAIL; 112ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 113ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 114ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Save data to HO */ 115ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fprintf(fp, AKFS_PRINTF_FORMAT, "HO.x", prms->mfv_ho.u.x) < 0) { ret = 0; } 116ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fprintf(fp, AKFS_PRINTF_FORMAT, "HO.y", prms->mfv_ho.u.y) < 0) { ret = 0; } 117ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fprintf(fp, AKFS_PRINTF_FORMAT, "HO.z", prms->mfv_ho.u.z) < 0) { ret = 0; } 118ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 119ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (fclose(fp) != 0) { 120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR_STR("fclose"); 121ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ret = 0; 122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (ret == 0) { 125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMERROR; 126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_FAIL; 127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return AKM_SUCCESS; 130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 132