43
43
#include "views/enum.h"
44
44
#include "views/transform.h"
45
#include "views/script.h"
47
48
#define BANKS_PATH ((xmlChar*)"/model/bank") /**< path to complete nodes of banks */
48
49
#define REGISTERS_PATH ((xmlChar*)"./register") /**< all standard registers nodes */
49
50
#define BIT_REGISTERS_PATH ((xmlChar*)"./field") /**< all bits registers nodes */
50
51
#define REGISTER_VIEWS_PATH ((xmlChar*)"./view") /**< supported register & field views */
51
#define TRANSFORM_VIEWS_PATH ((xmlChar*)"/model/transform") /**< path to complete nodes of views */
52
#define TRANSFORM_VIEWS_PATH ((xmlChar*)"/model/transform") /**< path to complete nodes of views */
53
#define SCRIPT_VIEWS_PATH ((xmlChar*)"/model/script") /**< path to complete nodes of views */
52
54
#define ENUM_VIEWS_PATH ((xmlChar*)"/model/enum") /**< path to complete nodes of views */
53
55
#define ENUM_ELEMENTS_PATH ((xmlChar*)"./name") /**< all elements in the enum */
54
56
#define UNITS_PATH ((xmlChar*)"/model/unit") /**< path to complete nodes of units */
55
#define UNIT_TRANSFORMS_PATH ((xmlChar*)"./transform") /**< all transforms of the unit */
57
#define UNIT_TRANSFORMS_PATH ((xmlChar*)"./transform") /**< all transforms of the unit */
548
static int pcilib_xml_create_script_view(pcilib_t *ctx, xmlXPathContextPtr xpath, xmlDocPtr doc, xmlNodePtr node) {
551
const char *value, *name;
552
pcilib_view_context_t *view_ctx;
554
pcilib_access_mode_t mode = 0;
555
pcilib_script_view_description_t desc = {{0}};
557
desc.base.api = &pcilib_script_view_api;
558
desc.base.type = PCILIB_TYPE_DOUBLE;
559
desc.base.mode = PCILIB_ACCESS_RW;
560
desc.py_script_module = NULL;
561
desc.script_name = NULL;
563
err = pcilib_xml_parse_view(ctx, xpath, doc, node, (pcilib_view_description_t*)&desc);
566
for (cur = node->properties; cur != NULL; cur = cur->next) {
567
if (!cur->children) continue;
568
if (!xmlNodeIsText(cur->children)) continue;
570
name = (char*)cur->name;
571
value = (char*)cur->children->content;
572
if (!value) continue;
574
if (!strcasecmp(name, "script")) {
575
//write script name to struct
576
desc.script_name = malloc(strlen(value));
577
sprintf(desc.script_name, "%s", value);
579
mode |= PCILIB_ACCESS_R;
583
desc.base.mode &= mode;
585
err = pcilib_add_views_custom(ctx, 1, (pcilib_view_description_t*)&desc, &view_ctx);
588
view_ctx->xml = node;
546
593
static int pcilib_xml_create_transform_view(pcilib_t *ctx, xmlXPathContextPtr xpath, xmlDocPtr doc, xmlNodePtr node) {
823
870
static int pcilib_xml_process_document(pcilib_t *ctx, xmlDocPtr doc, xmlXPathContextPtr xpath) {
825
xmlXPathObjectPtr bank_nodes = NULL, transform_nodes = NULL, enum_nodes = NULL, unit_nodes = NULL;
872
xmlXPathObjectPtr bank_nodes = NULL, transform_nodes = NULL, enum_nodes = NULL, unit_nodes = NULL, script_nodes = NULL;
826
873
xmlNodeSetPtr nodeset;
829
876
bank_nodes = xmlXPathEvalExpression(BANKS_PATH, xpath);
830
877
if (bank_nodes) transform_nodes = xmlXPathEvalExpression(TRANSFORM_VIEWS_PATH, xpath);
831
if (transform_nodes) enum_nodes = xmlXPathEvalExpression(ENUM_VIEWS_PATH, xpath);
878
if (transform_nodes) script_nodes = xmlXPathEvalExpression(SCRIPT_VIEWS_PATH, xpath);
879
if (script_nodes) enum_nodes = xmlXPathEvalExpression(ENUM_VIEWS_PATH, xpath);
832
880
if (enum_nodes) unit_nodes = xmlXPathEvalExpression(UNITS_PATH, xpath);
834
883
if (!unit_nodes) {
835
884
const unsigned char *expr = (enum_nodes?UNITS_PATH:(transform_nodes?ENUM_VIEWS_PATH:(bank_nodes?TRANSFORM_VIEWS_PATH:BANKS_PATH)));
850
899
if (err) pcilib_error("Error (%i) creating unit", err);
903
nodeset = script_nodes->nodesetval;
904
if(!xmlXPathNodeSetIsEmpty(nodeset)) {
905
for(i=0; i < nodeset->nodeNr; i++) {
906
err = pcilib_xml_create_script_view(ctx, xpath, doc, nodeset->nodeTab[i]);
907
if (err) pcilib_error("Error (%i) creating script transform", err);
854
911
nodeset = transform_nodes->nodesetval;
855
912
if (!xmlXPathNodeSetIsEmpty(nodeset)) {