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