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