1 #include <libxml/parser.h>
4 #include "lin_config.h"
6 static inline int linc_xml_get_prop_int(xmlNodePtr cur, const xmlChar* str)
11 attr = xmlGetProp(cur, str);
15 val = atoi((const char *)attr); // FIXME error handling
21 static inline int linc_xml_get_element_int(xmlDocPtr doc, xmlNodePtr cur)
26 key = xmlNodeListGetString(doc, cur->children, 1);
30 val = atoi((const char *)key); // FIXME error handling etc.
36 void linc_parse_scheduler_entries(struct linc_lin_state *linc_lin_state, xmlDocPtr doc, xmlNodePtr cur)
40 if (!xmlStrcmp(cur->name, (const xmlChar *)"Entry")) {
43 linid = linc_xml_get_element_int(doc, cur);
44 interval = linc_xml_get_prop_int(cur, (const xmlChar *)"Time");
46 linc_lin_state->scheduler_entry[linc_lin_state->scheduler_entries_cnt].lin_id = linid;
47 linc_lin_state->scheduler_entry[linc_lin_state->scheduler_entries_cnt].interval_ms = interval;
48 linc_lin_state->scheduler_entries_cnt++;
50 //printf("Time = %d Lin ID = %d Entry no. = %d\n",
51 // interval, linid, linc_lin_state->scheduler_entries_cnt-1);
57 void linc_parse_frame_configuration(struct linc_lin_state *linc_lin_state, xmlDocPtr doc, xmlNodePtr cur)
64 if (!xmlStrcmp(cur->name, (const xmlChar *)"Frame")) {
65 tmp_node = cur->children;
66 /* We are able to write into the main Configuration array after
67 parsing of all necessary elements (especially LIN ID) -- store
68 parsed elements in this temporary entry -- copy the entry afterwards */
69 struct linc_frame_entry tmp_fr_entry;
73 if (!xmlStrcmp(tmp_node->name, (const xmlChar *)"ID")) {
74 val = linc_xml_get_element_int(doc, tmp_node);
76 //printf("ID = %d\n", val);
78 if (!xmlStrcmp(tmp_node->name, (const xmlChar *)"Length")) {
79 val = linc_xml_get_element_int(doc, tmp_node);
80 tmp_fr_entry.data_len = val;
81 //printf("Length = %d\n", val);
83 if (!xmlStrcmp(tmp_node->name, (const xmlChar *)"Active")) {
84 val = linc_xml_get_element_int(doc, tmp_node);
85 tmp_fr_entry.status = val;
86 //printf("Active = %d\n", val);
88 if (!xmlStrcmp(tmp_node->name, (const xmlChar *)"Data")) {
91 tmp_node2 = tmp_node->children;
93 if (!xmlStrcmp(tmp_node2->name, (const xmlChar *)"Byte")) {
94 // Byte indexing in XML file is wrong
95 //indx = linc_xml_get_prop_int(tmp_node2,
96 // (const xmlChar *)"Index");
97 val = linc_xml_get_element_int(doc, tmp_node2);
98 //printf("Data = %d\n", val);
99 snprintf((char *)&tmp_fr_entry.data[indx], 1, "%i", val);
102 tmp_node2 = tmp_node2->next;
105 tmp_node = tmp_node->next;
108 if (linid >= 0 && linid <= MAX_LIN_ID) {
109 memcpy(&linc_lin_state->frame_entry[linid], &tmp_fr_entry,
110 sizeof(struct linc_frame_entry));
117 int linc_parse_configuration(char *filename, struct linc_lin_state *linc_lin_state)
123 filename = PCL_DEFAULT_CONFIG;
125 xmlKeepBlanksDefault(1);
126 doc = xmlParseFile(filename);
130 cur_node = xmlDocGetRootElement(doc);
131 if (cur_node == NULL) {
132 fprintf(stderr, "Configuration file %s is empty\n", filename);
137 /* Check for Root element */
138 if (xmlStrcmp(cur_node->name, (const xmlChar *)"PCLIN_PROFILE"))
141 /* Check for LIN element */
142 cur_node = cur_node->children;
144 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"LIN"))
147 cur_node = cur_node->next;
153 /* Process LIN configuration */
154 cur_node = cur_node->children;
156 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Active")) {
157 linc_lin_state->is_active = linc_xml_get_element_int(doc, cur_node);
159 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Baudrate")) {
160 linc_lin_state->baudrate = linc_xml_get_element_int(doc, cur_node);
162 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Master_Status")) {
163 linc_lin_state->master_status = linc_xml_get_element_int(doc, cur_node);
165 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Bus_Termination")) {
166 linc_lin_state->bus_termination = linc_xml_get_element_int(doc, cur_node);
168 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Scheduler_Entries")) {
169 linc_parse_scheduler_entries(linc_lin_state, doc, cur_node);
171 if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Frame_Configuration")) {
172 linc_parse_frame_configuration(linc_lin_state, doc, cur_node);
175 cur_node = cur_node->next;
182 fprintf(stderr, "Invalid configuration file\n");