solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit b50592853059f94672d12ee1835f91218c4f4fd9
parent 34627e1667be4a5a54a38b2cf9c3317dc19e5e5a
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  7 Nov 2016 16:20:56 +0100

Begin the parsing of the "sun" item

Diffstat:
Msrc/solstice_facility.c | 75++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/src/solstice_facility.c b/src/solstice_facility.c @@ -788,6 +788,78 @@ error: } /******************************************************************************* + * Sun + ******************************************************************************/ +static res_T +parse_sun(const char* filename, yaml_document_t* doc, const yaml_node_t* sun) +{ + enum { DNI, RADIAL_ANGULAR_DISTRIB, SPECTRUM }; + int mask = 0; /* Register the parsed attributes */ + intptr_t i, n; + res_T res = RES_OK; + ASSERT(doc && sun); + + if(sun->type != YAML_MAPPING_NODE) { + log_err(filename, sun, "expect a sun definition.\n"); + res = RES_BAD_ARG; + goto error; + } + + n = sun->data.mapping.pairs.top - sun->data.mapping.pairs.start; + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; + + key = yaml_document_get_node(doc, sun->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, sun->data.mapping.pairs.start[i].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(filename, key, "expect sun parameters.\n"); + res = RES_BAD_ARG; + goto error; + } + (void)val; /* TODO remove this line when val will be parsed */ + #define SETUP_MASK(Flag, Name) { \ + if(mask & BIT(Flag)) { \ + log_err(filename, key, "the sun "Name" is already defined.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ + mask |= BIT(Flag); \ + } (void)0 + if(!strcmp((char*)key->data.scalar.value, "dni")) { + SETUP_MASK(DNI, "dni"); /* TODO parse */ + } else if(!strcmp((char*)key->data.scalar.value, "buie")) { + SETUP_MASK(RADIAL_ANGULAR_DISTRIB, "radial angular distribution"); /* TODO parse */ + } else if(!strcmp((char*)key->data.scalar.value, "pillbox")) { + SETUP_MASK(RADIAL_ANGULAR_DISTRIB, "radial angular distribution"); /* TODO parse */ + } else if(!strcmp((char*)key->data.scalar.value, "spectrum")) { + SETUP_MASK(SPECTRUM, "spectrum"); /* TODO parse */ + } else { + log_err(filename, key, "unknown sun parameter `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + } + if(res != RES_OK) goto error; + #undef SETUP_MASK + } + + #define CHECK_PARAM(Flag, Name) \ + if(!(mask & BIT(Flag))) { \ + log_err(filename, sun, "the sun "Name" is missing.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } (void)0 + CHECK_PARAM(DNI, "dni"); + CHECK_PARAM(SPECTRUM, "spectrum"); + #undef CHECK_PARAM + +exit: + return res; +error: + goto exit; +} + +/******************************************************************************* * Item ******************************************************************************/ static res_T @@ -831,7 +903,8 @@ parse_item } else if(!strcmp((char*)key->data.scalar.value, "pivot")) { res = parse_pivot(filename, doc, val); } else if(!strcmp((char*)key->data.scalar.value, "spawn")) { /* TODO */ - } else if(!strcmp((char*)key->data.scalar.value, "sun")) { /* TODO */ + } else if(!strcmp((char*)key->data.scalar.value, "sun")) { + res = parse_sun(filename, doc, val); } else { log_err(filename, key, "unknown item `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG;