summaryrefslogtreecommitdiffstats
path: root/src/steering_wheel_json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/steering_wheel_json.c')
-rw-r--r--src/steering_wheel_json.c346
1 files changed, 346 insertions, 0 deletions
diff --git a/src/steering_wheel_json.c b/src/steering_wheel_json.c
new file mode 100644
index 0000000..9d72284
--- /dev/null
+++ b/src/steering_wheel_json.c
@@ -0,0 +1,346 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <json-c/json.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include "af-steering-wheel-binding.h"
+#include "steering_wheel_json.h"
+#include "prop_info.h"
+#include "prop_search.h"
+
+extern double gearRatio[];
+
+struct wheel_info_t *wheel_info;
+
+static int parse_property(struct wheel_info_t *wheel_info, int idx, json_object *obj_property)
+{
+ int var_type = 0;
+ char *name = NULL;
+
+ if(obj_property)
+ {
+ json_object_object_foreach(obj_property, key, val)
+ {
+ if (strcmp("PROPERTY", key) == 0)
+ {
+ name = (char *)json_object_get_string(val);
+ }
+ else if(strcmp("TYPE", key) == 0)
+ {
+ const char *_varname = json_object_get_string(val);
+ var_type = string2vartype(_varname);
+ }
+ }
+
+ wheel_info->property[idx].name = strdup(name);
+ wheel_info->property[idx].var_type = (unsigned char)var_type;
+ }
+
+ return 0;
+}
+
+#define DEFAULT_PROP_CNT (16)
+static int parse_propertys(json_object *obj_propertys)
+{
+ int err = 0;
+ json_object * obj_property;
+ size_t ms = sizeof(struct wheel_info_t) + (size_t)(DEFAULT_PROP_CNT*sizeof(struct prop_info_t));
+
+ if(obj_propertys)
+ {
+ wheel_info = malloc(ms);
+ if (wheel_info == NULL)
+ {
+ ERRMSG("Not enogh memory");
+ return 1;
+ }
+ memset(wheel_info, 0 , ms);
+
+ enum json_type type = json_object_get_type(obj_propertys);
+ if (type == json_type_array)
+ {
+ int array_len = json_object_array_length(obj_propertys);
+ if(array_len > DEFAULT_PROP_CNT)
+ {
+ wheel_info = realloc(wheel_info, sizeof(struct wheel_info_t) + ((size_t)array_len * sizeof(struct prop_info_t)));
+ if (wheel_info == NULL)
+ {
+ ERRMSG("not enogh memory");
+ exit(1);
+ }
+
+ memset(&wheel_info->property[DEFAULT_PROP_CNT], 0, (size_t)(array_len - DEFAULT_PROP_CNT)*sizeof(struct prop_info_t));
+ }
+
+ for (int i = 0; i < array_len; i++)
+ {
+ obj_property = json_object_array_get_idx(obj_propertys, i);
+ err = parse_property(wheel_info, i, obj_property);
+ }
+
+ wheel_info->nData = (unsigned int)array_len;
+ addAllPropDict(wheel_info);
+ }
+ }
+
+ return err;
+}
+
+static int parse_json(json_object *obj)
+{
+ int err = 0;
+ json_object_object_foreach(obj, key, val)
+ {
+ if (strcmp(key,"PROPERTYS") == 0)
+ {
+ err += parse_propertys(val);
+ }
+ else
+ {
+ ++err;
+ ERRMSG("json: Unknown key \"%s\"", key);
+ }
+ }
+ return err;
+}
+
+int wheel_define_init(const char *fname)
+{
+ struct json_object *jobj;
+ int fd_wheel_map;
+ struct stat stbuf;
+ char *filebuf;
+
+ fd_wheel_map = afb_daemon_rootdir_open_locale(fname, O_RDONLY, NULL);
+ if (fd_wheel_map < 0)
+ {
+ ERRMSG("wheel map is not access");
+ return -1;
+ }
+
+ FILE *fp = fdopen(fd_wheel_map,"r");
+ if (fp == NULL)
+ {
+ ERRMSG("canno read wheel map file");
+ return -1;
+ }
+
+ if (fstat(fd_wheel_map, &stbuf) == -1)
+ {
+ ERRMSG("cant get file state");
+ return -1;
+ }
+
+ filebuf = (char *)malloc(stbuf.st_size);
+ fread(filebuf, 1, stbuf.st_size, fp);
+ fclose(fp);
+
+ jobj = json_tokener_parse(filebuf);
+ if (jobj == NULL)
+ {
+ ERRMSG("cannot data from file \"%s\"",fname);
+ free(filebuf);
+ return 1;
+ }
+
+ parse_json(jobj);
+
+ json_object_put(jobj);
+
+ free(filebuf);
+ return 0;
+}
+
+static int parse_gear_para_json(json_object *obj)
+{
+ int err = 0;
+ json_object * obj_speed_para;
+ char *pos_name = NULL;
+ double pos_val = 0;
+
+ json_object_object_foreach(obj, key, val)
+ {
+ if (strcmp(key,"GEAR_PARA") == 0)
+ {
+ enum json_type type = json_object_get_type(val);
+ if (type == json_type_array)
+ {
+ int array_len = json_object_array_length(val);
+ NOTICEMSG("array_len:%d!", array_len);
+ for (int i = 0; i < array_len; i++)
+ {
+ obj_speed_para = json_object_array_get_idx(val, i);
+ if(obj_speed_para)
+ {
+ json_object_object_foreach(obj_speed_para, key, val)
+ {
+ ///
+ if (strcmp("POS", key) == 0)
+ {
+ pos_name = (char *)json_object_get_string(val);
+ }
+ else if(strcmp("VAL", key) == 0)
+ {
+ pos_val = json_object_get_double(val);
+ }
+
+ ///
+ if(strcmp("First", pos_name) == 0)
+ {
+ gearRatio[1] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Second", pos_name) == 0)
+ {
+ gearRatio[2] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Third", pos_name) == 0)
+ {
+ gearRatio[3] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Fourth", pos_name) == 0)
+ {
+ gearRatio[4] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Fifth", pos_name) == 0)
+ {
+ gearRatio[5] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Sixth", pos_name) == 0)
+ {
+ gearRatio[6] = (double)(1.0 / pos_val);
+ }
+ else if(strcmp("Reverse", pos_name) == 0)
+ {
+ gearRatio[7] = (double)(1.0 / pos_val);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ ERRMSG("json: Need array \"%s\"", key);
+ }
+ }
+ else
+ {
+ ERRMSG("json: Unknown key \"%s\"", key);
+ }
+ }
+ return err;
+}
+
+int wheel_gear_para_init(const char *fname)
+{
+ struct json_object *jobj;
+ int fd_gear_para;
+ struct stat stbuf;
+ char *filebuf;
+
+ fd_gear_para = afb_daemon_rootdir_open_locale(fname, O_RDONLY, NULL);
+ if (fd_gear_para < 0)
+ {
+ ERRMSG("gear para is not access");
+ return -1;
+ }
+
+ FILE *fp = fdopen(fd_gear_para,"r");
+ if (fp == NULL)
+ {
+ ERRMSG("canno read gear para file");
+ return -1;
+ }
+
+ if (fstat(fd_gear_para, &stbuf) == -1)
+ {
+ ERRMSG("cant get file state.\n");
+ return -1;
+ }
+
+ filebuf = (char*)malloc(stbuf.st_size);
+ fread(filebuf, 1, stbuf.st_size, fp);
+ fclose(fp);
+
+ jobj = json_tokener_parse(filebuf);
+ if (jobj == NULL)
+ {
+ ERRMSG("cannot data from file \"%s\"",fname);
+ free(filebuf);
+ return 1;
+ }
+ parse_gear_para_json(jobj);
+
+ json_object_put(jobj);
+
+ free(filebuf);
+ return 0;
+}
+
+struct json_object *property2json(struct prop_info_t *property)
+{
+ struct json_object *jobj;
+ struct json_object *nameObject = NULL;
+ struct json_object *valueObject = NULL;
+
+ if (property == NULL)
+ return NULL;
+
+ jobj = json_object_new_object();
+ if (jobj == NULL)
+ return NULL;
+ switch(property->var_type)
+ {
+ case VOID_T: /* FALLTHROUGH */
+ case INT8_T: /* FALLTHROUGH */
+ case INT16_T: /* FALLTHROUGH */
+ case INT_T: /* FALLTHROUGH */
+ case INT32_T: /* FALLTHROUGH */
+ case INT64_T: /* FALLTHROUGH */
+ case UINT8_T: /* FALLTHROUGH */
+ case UINT16_T: /* FALLTHROUGH */
+ case UINT_T: /* FALLTHROUGH */
+ case UINT32_T: /* FALLTHROUGH */
+ case ENABLE1_T:
+ valueObject = json_object_new_int(propertyValue_int(property));
+ break;
+
+ case BOOL_T:
+ valueObject = json_object_new_boolean(property->curValue.bool_val);
+ break;
+
+ default:
+ ERRMSG("Unknown value type:%d", property->var_type);
+ break;
+ }
+
+ if (valueObject == NULL)
+ {
+ ERRMSG("fail json ValueObject");
+ json_object_put(jobj);
+ return NULL;
+ }
+
+ nameObject = json_object_new_string(property->name);
+
+ json_object_object_add(jobj, "name", nameObject);
+ json_object_object_add(jobj, "value", valueObject);
+
+ return jobj;
+}